我想生成具有以下条件的大小为 2 的整数列表的列表。
- 第一个元素应小于第二个元素
- 所有数据都应该是唯一的。
我可以使用自定义函数生成每个元组,但不知道如何使用它来满足第二个条件。
from hypothesis import strategies as st
@st.composite
def generate_data(draw):
min_val, max_val = draw(st.lists(st.integers(1, 1e2), min_size=2, max_size=2))
st.assume(min_val < max_val)
return [min_val, max_val]
我可以通过以这种(低效?)方式迭代generate_date
几次来生成数据:
>>> [generate_data().example() for _ in range(3)]
[[5, 31], [1, 12], [33, 87]]
但是我如何检查数据是否唯一?
例如,以下值无效:
[[1, 2], [1, 5], ...] # (1 is repeated)
[[1, 2], [1, 2], ...] # (repeated data)
但以下内容有效:
[[1, 2], [3, 4], ...]
最佳答案
我认为以下策略可以满足您的要求:
import hypothesis.strategies as st
@st.composite
def unique_pair_lists(draw):
data = draw(st.lists(st.integers(), unique=True)
if len(data) % 2 != 0:
data.pop()
result = [data[i:i+2] for i in range(0, len(data), 2)]
for pair in result:
pair.sort()
return result
这里的想法是,我们生成一些能够提供正确元素的东西,然后将其转换为正确形状的东西。我们不是尝试生成整数列表对,而是生成一个唯一整数列表,然后将它们分组(如果整数数量为奇数,则删除最后一个元素)。然后,我们对每一对进行排序,以确保其顺序正确。
关于python - 使用 Hypothesis Python 生成条件数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49755719/