给定一个多个iterable的列表,我想测试所有项是否disjoint。
two sets are said to be disjoint if they have no element in common
例子:
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以最后一次附加第一个元素。但这并不完全正确,因为它只测试相邻项,而不是针对列表中的所有其他项测试每个项。。有更简单的方法吗? 最佳答案
。
您可以使用''.join
连接字符串并定义函数:
def all_disjoint(iterables):
total = ''.join(iterables)
return len(total) == len(set(total))
现在,测试:
all_disjoint(['AB', 'CDE', 'AF'])
# False
all_disjoint(['AB', 'CDE', 'FG'])
# True
关于python - 如何测试列表中的所有项目不相交?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45655936/