给定多个迭代列表,我想测试所有项目是否为disjoint。如何测试列表中的所有项目是不相交的?
两组被认为是不相交如果它们的共同点
实施例没有元素:
iterables = ["AB", "CDE", "AF"]
all_disjoint(iterables)
# False
iterables = ["AB", "CDE", "FG"]
all_disjoint(iterables)
# True
Python的集合具有一个isdisjoint
方法,该方法有效,但它被设计用于一次测试两个元素。一种方法是将该方法应用于元件的每个成对组:
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))
在这里,我修改pairwise
itertools recipe附着在第一元件最后一次。这是不正确的,因为它只测试邻近的项目,而不是每个项目对列表中的所有其他项目。我想用更少的代码更优雅地测试所有元素。有没有更简单的方法来做到这一点?
您的代码测试以查看'x'中的每个迭代器是否与紧接在它之前的那个迭代器和它之后的那个迭代器(当它们存在时)是不相交的。这与确定他们是否与所有其他人不相交是不一样的。这是你的目标吗?顺便说一句,修改食谱没什么问题。 – martineau
你说得对。此代码仅测试邻居项目是否不相交。相反,我想测试每个项目是否与所有其他项目脱节。至于修改食谱,我只是想减少代码。 – pylang