给定一个多个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))

在这里,我修改了pairwiseitertools 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/

10-11 23:02
查看更多