[英]Python -Intersection of multiple lists?
我正在玩 python 並且能夠獲得兩個列表的交集:
result = set(a).intersection(b)
現在,如果d
是一個包含a
和b
以及第三個元素c
,是否有內置函數用於查找d
中所有三個列表的交集? 所以例如,
d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
那么結果應該是
[3,4]
set.intersection(*map(set,d))
對於 2.4,您可以只定義一個交集函數。
def intersect(*d):
sets = iter(map(set, d))
result = sets.next()
for s in sets:
result = result.intersection(s)
return result
對於較新版本的python:
交集方法接受任意數量的參數
result = set(d[0]).intersection(*d[1:])
或者,您可以將第一組與其自身相交以避免切片列表並制作副本:
result = set(d[0]).intersection(*d)
我不確定哪個更有效,並且感覺它取決於d[0]
的大小和列表的大小,除非 python 有一個內置的檢查,比如
if s1 is s2:
return s1
在交集方法中。
>>> d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
>>> set(d[0]).intersection(*d)
set([3, 4])
>>> set(d[0]).intersection(*d[1:])
set([3, 4])
>>>
@用戶3917838
漂亮而簡單,但需要一些鑄造才能使其工作並因此給出一個列表。 它應該看起來像:
list(reduce(set.intersection, [set(item) for item in d ]))
其中:
d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
結果是:
[3, 4]
至少在 Python 3.4 中
您可以使用set.intersection(set1, set2, set3...)
獲得任意數字集的交集。 所以你只需要將你的列表轉換成集合,然后將它們傳遞給這個方法,如下所示:
d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
set.intersection(*[set(x) for x in d])
結果:
{3, 4}
Lambda 減少。
from functools import reduce #you won't need this in Python 2
l=[[1, 2, 3, 4], [2, 3, 4], [3, 4, 5, 6, 7]]
reduce(set.intersection, [set(l_) for l_ in l])
或者,使用numpy.intersect1d
,它不僅可用於將兩個列表相交。
雖然很多人都提到過,但我發現reduce()
特別有用。 事實上,Numpy 文檔推薦使用reduce()
來交叉多個列表: numpy.intersect1d 參考
要回答您的問題,只需:
import numpy as np
from functools import reduce
reduce(np.intersect1d,d)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.