叮當(dāng)貓咪
2019-06-20 17:26:55
從另一個(gè)列表中刪除所有出現(xiàn)在列表中的元素假設(shè)我有兩份名單,l1和l2..我想表演l1 - l2的所有元素。l1不在l2.我可以想到一種簡(jiǎn)單的循環(huán)方法來(lái)實(shí)現(xiàn)這一點(diǎn),但這將是非常低效率的。什么是節(jié)奏曲和有效的方式來(lái)做到這一點(diǎn)?舉個(gè)例子,如果我有l(wèi)1 = [1,2,6,8] and l2 = [2,3,5,8], l1 - l2應(yīng)該回來(lái)[1,6]
3 回答

千萬(wàn)里不及你
TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊
l3
:
l3 = [x for x in l1 if x not in l2]
l3
[1, 6]
.

人到中年有點(diǎn)甜
TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊
>>> set([1,2,6,8]) - set([2,3,5,8])set([1, 6])

蝴蝶不菲
TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
您可以通過(guò)使用生成器理解而不是列表理解來(lái)獲得更好的結(jié)果,并使用set
數(shù)據(jù)結(jié)構(gòu)(因?yàn)?code>in運(yùn)算符在列表上是O(N),而在集合上是O(1)。
所以這里有一個(gè)對(duì)你有用的函數(shù):
def?filter_list(full_list,?excludes): ????s?=?set(excludes) ????return?(x?for?x?in?full_list?if?x?not?in?s)
結(jié)果將是一個(gè)可迭代的,它將懶洋洋地獲取篩選的列表。如果您需要一個(gè)真正的列表對(duì)象(例如,如果您需要執(zhí)行len()
),然后您就可以輕松地構(gòu)建如下所示的列表:
filtered_list?=?list(filter_list(full_list,?excludes))
添加回答
舉報(bào)
0/150
提交
取消