複数のイテラブルのリストがある場合、すべてのアイテムがdisjointであるかどうかをテストします。リストのすべての項目をテストするにはどうしたらいいですか?
二組は、それらが共通
例には要素がない場合互いに素であると言われている
:
iterables = ["AB", "CDE", "AF"]
all_disjoint(iterables)
# False
iterables = ["AB", "CDE", "FG"]
all_disjoint(iterables)
# True
Pythonのセットが動作isdisjoint
方法を持っているが、それが設計されています一度に2つの要素をテストします。一つのアプローチは、素子の各ペアワイズグループにこの方法を適用することである:ここ
import itertools as it
def pairwise_(iterable):
"""s -> (s0,s1), (s1,s2), (s2,s3), ..., (sn,s0)"""
# Modified: the last element wraps back to the first element.
a, b = it.tee(iterable, 2)
first = next(b, None)
b = it.chain(b, [first])
return zip(a, b)
def all_disjoint(x):
return all((set(p0).isdisjoint(set(p1))) for p0, p1 in pairwise_(x))
Iは最初の要素を最後の時間を取り付けるpairwise
itertools recipe修飾しました。しかし、リスト内の他のすべての項目に対して、各項目ではなく隣接項目をテストするだけなので、これは正しくありません。より少ないコードでよりエレガントにすべての要素をテストしたいと思います。これを行う簡単な方法はありますか?
あなたのコードは、 'x'の各反復可能なものが、その直前のものと直後のもの(それらが存在する場合)とは互いに素であるかどうかを調べるためにテストします。これは、すべてが他のすべてから切り離されているかどうかを判断するのと同じではありません。それはあなたの目標ですか?レシピの変更には何も問題はありません、btw。 – martineau
あなたは正しいです。このコードは、隣接する項目が互いに素であるかどうかだけをテストします。むしろ、私は各項目が他のすべての項目と離れていることをテストしたいと思います。レシピを変更する場合は、コードを少なくするだけです。 – pylang