![](/img/trans.png)
[英]fastest way to check if atleast one element in set/list is in each element in a collection of lists/sets
[英]Check element overlaps in list of sets
我有一個集合列表,ss,想測試一個“測試”是否滿足條件:
對於 ss 中的每個集合,“test”中的集合中必須有一個元素。
代碼如下:
ss = [{"a"}, {"c", "d", "e"}, {"b", "g"}]
test1 = {'a', 'c', 'b'}
test2 = {'a', 'c'}
print('Test1: ')
def match(ss, test):
for s in ss:
overlap = not s.isdisjoint(test)
if not overlap:
return False
return True
print(match(ss, test1)) // true
print(match(ss, test2)) // false
有什么漏洞,或者有更好的方法嗎?
這對我來說看起來不錯,因為查看代碼可以很好地傳達其含義。 我的建議是,你避免雙重not
,但:
disjoint = s.isdisjoint(test)
if disjoint:
return False
這可能會使邏輯更容易遵循。 一旦你有了它,你也可以擺脫那個變量,直接檢查isdisjoint
值:
if s.isdisjoint(test):
return False
這就是我將其保留的地方,以保持邏輯易於遵循。
如果你真的想要,你可以把它縮短為一行:
def match(ss, test):
return all(not s.isdisjoint(test) for s in ss)
至於性能或正確性,對於這些要求,您將無法比這更好:為了從集合列表中的每個集合中判斷一個集合 ( test
) 的任何元素是否包含,您必須檢查每一組。 所以這證明你對這些集合的循環是合理的。 當你在尋找兩個集合的交集時,使用標准的集合操作將是你能得到的最好的結果。
如果您有更專業的需求,或者一些更長的測試系列,您可以從早期的測試結果中做出一些假設(例如,通過以某種方式對您的test
集進行排序),那么可能會有一些進一步的優化,但如果我們只是使用match
進行單個測試,那么我認為您已經進行了足夠的優化,無需擔心。
另一種選擇可能是.intersection(another_set)
。 對於列表中的每個集合,您將詢問test
是否至少有一個共同元素。 使用理解列表將是:
def match(ss, test):
return all(len(test.intersection(s)) > 0 for s in ss)
沒有理解列表:
def match(ss, test):
answers = []
for s in ss:
answers.append(len(test.intersection(s)) > 0)
return all(answers)
print(match(ss, test1)) # True
print(match(ss, test2)) # False
您可以做一個簡單的理解來確定匹配的元素,然后檢查滿足條件的集合列表是否與ss
相同:
ss = [{"a"}, {"c", "d", "e"}, {"b", "g"}]
test1 = {'a', 'c', 'b'}
test2 = {'a', 'c'}
def match(ss, test):
matching = [s for s in ss if any(i for i in s if i in test)]
return matching == ss
match(ss, test1) -> True
match(ss, test2) -> False
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.