比较Python嵌套列表

时间:2010-01-08 18:34:02

标签: python list nested intersection

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

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]')。这些清单可能会很长。有没有一种有效的方法呢?

6 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

使用集合执行此操作是一个非常好的实现,但为了获得最佳性能,您应该只使用一个集:

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]

答案 2 :(得分:0)

这是一种方法。将您的列表转换为集合并找到它们的交叉点。

>>> 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]')])

我不认为它会因你的名单长度而降低很多。

答案 3 :(得分:0)

只需使用设置内置支持

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

Boom 这是你的工会

答案 4 :(得分:0)

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

但是只使用它,如果由于某种原因你在列表中有可变项并且无法转换为集合。当然,这完全取决于列表的大小和重复的数量,但它可能要慢10倍。

答案 5 :(得分:0)

     python 3.2
     [i for i in list1 for v in list2 if i==v]
相关问题