1

次の条件で、サイズ 2 の整数のリストのリストを生成したいと考えています。

  • 最初の要素は 2 番目の要素より小さく、
  • すべてのデータは一意である必要があります。

カスタム関数を使用して各タプルを生成できますが、それを使用して 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], ...]
4

2 に答える 2

3

次の戦略が要件を満たしていると思います。

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

ここでの考え方は、適切な要素を与えるものを生成し、それを適切な形に変換するというものです。整数のリストのペアを生成しようとするのではなく、一意の整数のリストを生成し、それらをペアにグループ化します (整数の数が奇数の場合は最後の要素を削除します)。次に、正しい順序になるように各ペアを並べ替えます。

于 2018-04-11T08:21:52.967 に答える