簡體   English   中英

比較Python嵌套列表

[英]Comparing Python nested lists

我有兩個嵌套列表,每個嵌套列表包含兩個字符串,例如:

list 1 [('EFG', '[3,4,5]'), ('DEF', '[2,3,4]')] and list 2 [('DEF', '[2,3,4]'), ('FGH', '[4,5,6]')]

我想比較兩個列表並恢復那些彼此相同的嵌套列表。 在這種情況下,只返回('DEF','[2,3,4]') 這些清單可能會很長。 有沒有一種有效的方法來做到這一點?

如果列表只包含字符串元組,那么最簡單的方法是使用集合交集(&):

>>> set([('EFG', '[3,4,5]'), ('DEF', '[2,3,4]')]) & set([('DEF', '[2,3,4]'), ('FGH', '[4,5,6]')])
set([('DEF', '[2,3,4]')])

使用集合執行此操作是一個非常好的實現,但為了獲得最佳性能,您應該只使用一個集合:

set1 = set([('EFG', '[3,4,5]'), ('DEF', '[2,3,4]')])
matches = [x for x in [('DEF', '[2,3,4]'), ('FGH', '[4,5,6]')] if x in set1]
     python 3.2
     [i for i in list1 for v in list2 if i==v]

這是一種方法。 將列表轉換為集合並查找其交叉點。

>>> a,b = set([('EFG', '[3,4,5]'), ('DEF', '[2,3,4]')]), set([('DEF', '[2,3,4]'), ('FGH', '[4,5,6]')])
>>> print a.intersection(b)
set([('DEF', '[2,3,4]')])

我不認為它會因你的列表長度而降低很多。

只需使用set的內置支持

def get_set(list1,list2):
    s = set(list1)
    s &= set(list2)
    return s

Boom有你的聯盟

intersection = [item for item in list1 if item in list2]

但是只使用它,如果由於某種原因你在列表中有可變項並且無法轉換為集合。 當然,這完全取決於列表的大小和重復的數量,但它可能要慢10倍。

暫無
暫無

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

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