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