簡體   English   中英

Python中兩個列表的有序交集

[英]Ordered intersection of two lists in Python

我知道在Python中,如果有:

list_1 = [1,2,3]
list_2 = [2,3,4]

我可以執行以下操作找到兩者之間的交集:

list(set(list_1) & set(list_2))
# = [2,3]

但是這種方法存在一個問題:集不像列表那樣保持順序。 所以如果我真的有:

list_1 = [3,2,1]
list_2 = [2,3,4]

我得到:

list(set(list_1) & set(list_2))
# = [2,3]

即使我更希望從第一個列表中獲得訂單,即:

# = [3,2]

有沒有一種替代的相交技術,可以使生成的“相交集”保持與第一個列表相同的順序?

set_2 = frozenset(list_2)
intersection = [x for x in list_1 if x in set_2]

set而不是frozenset工作原理,在我不打算對數據進行突變的情況下,我越來越習慣使用不可變的類。 關鍵是要維護順序,您需要按照要維護的順序遍歷列表,但是您不希望天真的方法具有n * m的復雜性: [x for x in list_1 if x in list_2] 與列表中的成員資格的O(n)相比,檢查set或類似的基於哈希的類型中的成員資格大約為O(1)。

使用列表的索引方法作為排序標准:

l1 = [3, 2, 1]
l2 = [2, 3, 4]
sorted(set(l1) & set(l2), key = l1.index)

出:

[3, 2]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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