如何在两个列表之间找到共同的子列表?

时间:2014-01-30 05:12:25

标签: python list set sublist

如果子列表也出现在另一个列表中,您如何找到或保留列表的子列表?

lsta = [['a','b','c'],['c','d','e'],['e','f','g']]
lstb = [['a','b','c'],['d','d','e'],['e','f','g']]

我想做set(lsta)&amp ;; set(lstb)

Desired_List = [['a','b','c'],['e','f','g']]

我想做类似set的事情的原因在于它的速度,因为我在一个非常大的列表中这样做,效率非常重要。

另外,稍微不相关,如果我想从lsta中减去lstb来获取

Desired_List2 = [['d','d','e']]

3 个答案:

答案 0 :(得分:4)

更好地将列表列表更改为元组列表,然后您可以轻松使用设置操作:

>>> tupa = map(tuple, lsta)
>>> tupb = map(tuple, lstb)
>>> set(tupa).intersection(tupb)
set([('a', 'b', 'c'), ('e', 'f', 'g')])
>>> set(tupa).difference(tupb)
set([('c', 'd', 'e')])

答案 1 :(得分:2)

如果您的子列表需要保留列表,请使用list comprehension

路口:

>>> [i for i in lsta if i in lstb]
[['a', 'b', 'c'], ['e', 'f', 'g']]

减法:

>>> [i for i in lsta if i not in lstb]
[['c', 'd', 'e']]

答案 2 :(得分:0)

我刚才写了a C module

>>> lsta = [['a','b','c'],['c','d','e'],['e','f','g']]
>>> lstb = [['a','b','c'],['d','d','e'],['e','f','g']]
>>> list(boolmerge.andmerge(lsta, lstb))
>>> import boolmerge
[['a', 'b', 'c'], ['e', 'f', 'g']]

这是O(n)时间,需要对列表进行排序。