簡體   English   中英

Python-比較兩個集合列表

[英]Python - Comparing two lists of sets

我有兩個清單:

list1 = [
    set(['3105']),
    set(['3106', '3107']),
    set(['3115']),
    set(['3122']),
    set(['3123', '3126', '286'])
]

list2 = [
    set(['400']),
    set(['3115']),
    set(['3100']),
    set(['3107']),
    set(['3123', '3126'])
]

如何比較這些列表的交集,例如,如果3126在兩個列表的任何一組中的某處,它將附加另一個帶有3126的列表。我的最終目標是附加一個單獨的列表,然后取長度的列表,所以我知道列表之間有多少匹配項。

您必須合並所有集合; 取兩個列表中集合的並集,然后取這兩個並集的交集:

sets_intersection = reduce(set.union, list1) & reduce(set.union, list2)

if 3126 in sets_intersection:
    # ....
>>> common_items = set().union(*list1) & set().union(*list2)
>>> common_items
set(['3123', '3115', '3107', '3126'])
>>> '3126' in common_items
True

時序比較:

>>> %timeit reduce(set.union, list1) & reduce(set.union, list2)
100000 loops, best of 3: 11.7 us per loop
>>> %timeit set().union(*list1) & set().union(*list2)      #winner
100000 loops, best of 3: 4.63 us per loop
>>> %timeit set(s for x in list1 for s in x) & set(s for x in list2 for s in x)
10000 loops, best of 3: 11.6 us per loop
>>> %timeit import itertools;set(itertools.chain.from_iterable(list1)) & set(itertools.chain.from_iterable(list2))
100000 loops, best of 3: 9.91 us per loop

您可以將兩個集合列表放平為集合:

l1 = set(s for x in list1 for s in x)
l2 = set(s for x in list2 for s in x)

然后,您可以計算交集:

common = l1.intersection(l2)  # common will give common elements
print len(common) # this will give you the number of elements in common.

結果:

>>> print common
set(['3123', '3115', '3107', '3126'])
>>> len(common)
4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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