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