我想生成一个大小为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], ...]
答案 0 :(得分:2)
我认为以下策略满足您的要求:
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
这里的想法是我们生成一些能够提供正确元素的东西,然后我们将它转换为正确形状的东西。我们不是试图生成整数列表,而是生成一个唯一整数列表,然后将它们分组成对(如果有奇数个整数,则删除最后一个元素)。然后我们对每一对进行排序,以确保它的顺序正确。
答案 1 :(得分:1)
David的解决方案允许整数出现在两个子列表中 - 对于完全唯一的整数我会使用以下内容:
@st.composite
def list_of_pairs_of_unique_elements(draw):
seen = set()
new_int = st.integers(1, 1e2)\
.filter(lambda n: n not in seen)\ # Check that it's unique
.map(lambda n: seen.add(n) or n) # Add to filter before next draw
return draw(st.lists(st.tuples(new_int, new_int).map(sorted))
.filter(...)
方法可能就是您正在寻找的方法。.example()
仅供互动使用 - 如果您在@given()
中使用,则会收到警告(或错误)。