[英]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.