簡體   English   中英

Python - 多個列表的交集?

[英]Python -Intersection of multiple lists?

我正在玩 python 並且能夠獲得兩個列表的交集:

result = set(a).intersection(b)

現在,如果d是一個包含ab以及第三個元素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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM