Python 如何在两个列表之间找到公共子列表?

Python 如何在两个列表之间找到公共子列表?,python,list,set,sublist,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)和set(lstb)的事情 我之所以想做set这样的事情是因为它的速度,因为我在一个非常大的列表上做这件事,其中效率非常重要 还有,稍微无关,如果我想从lsta中减去lstb得到 Desired_

如果子列表也存在于另一个列表中,那么如何仅查找或保留列表的子列表

lsta = [['a','b','c'],['c','d','e'],['e','f','g']]
lstb = [['a','b','c'],['d','d','e'],['e','f','g']]
我想做一些类似set(lsta)和set(lstb)的事情

我之所以想做set这样的事情是因为它的速度,因为我在一个非常大的列表上做这件事,其中效率非常重要

还有,稍微无关,如果我想从lsta中减去lstb得到

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

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

交叉口:

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

最好将列表列表更改为元组列表,这样就可以轻松使用集合操作:

>>> 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')])
我不久前曾为此写过:

>>> 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)时间,需要对列表进行排序。

使用集合的另一个方便之处是
&
-
的重载:
tupa-tupb
tupa&tupb
如果元组中的元素顺序是任意的,即
('a'、'b'、'c')
在一个列表和
('b'、'a'、'c'),这会起作用吗
在另一个系统中?
>>> 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']]