簡體   English   中英

檢查集合列表中的元素重疊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM