Python中两个列表的有序交集

mac*_*ost 10 python list

我知道在Python中,如果我有:

list_1 = [1,2,3]
list_2 = [2,3,4]
Run Code Online (Sandbox Code Playgroud)

我可以做以下事情来找到两者之间的交集:

list(set(list_1) & set(list_2))
# = [2,3]
Run Code Online (Sandbox Code Playgroud)

但是这种方法存在一个问题:集合不像列表那样维护顺序.所以如果我真的有:

list_1 = [3,2,1]
list_2 = [2,3,4]
Run Code Online (Sandbox Code Playgroud)

我明白了:

list(set(list_1) & set(list_2))
# = [2,3]
Run Code Online (Sandbox Code Playgroud)

即使我更喜欢从第一个列表中获得订单,即:

# = [3,2]
Run Code Online (Sandbox Code Playgroud)

是否有另一种交叉技术可以使得到的"交集"与第一个列表保持相同的顺序?

Pet*_*per 18

set_2 = frozenset(list_2)
intersection = [x for x in list_1 if x in set_2]
Run Code Online (Sandbox Code Playgroud)

set而不是frozenset作品也一样,我只是越来越多地在我不打算变异的数据的情况下使用一成不变的类的习惯.关键是要维护顺序,你需要按照你想要维护的顺序遍历列表,但是你不希望具有天真方法的n*m复杂性:[x for x in list_1 if x in list_2].检查set基于类似哈希的类型的成员资格大致为O(1),与列表中成员资格的O(n)相比.


kof*_*ein 5

使用列表的索引方法作为排序标准:

l1 = [3, 2, 1]
l2 = [2, 3, 4]
sorted(set(l1) & set(l2), key = l1.index)
Run Code Online (Sandbox Code Playgroud)

日期:

[3, 2]
Run Code Online (Sandbox Code Playgroud)

  • 馊主意.该解决方案将是O(n ^ 2),因为交集中的每个元素都必须搜索列表以找到索引.彼得的解决方案是O(n). (3认同)