給定多個迭代列表,我想測試所有項目是否爲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