Python中两个列表的有序交集

时间:2014-05-07 21:42:15

标签: python list

我知道在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]

是否有另一种交叉技术可以保持所产生的交叉组#34;以与第一个列表相同的顺序?

2 个答案:

答案 0 :(得分:17)

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]。检查set或类似基于散列的类型的成员资格大致为O(1),而列表中的成员资格为O(n)。

答案 1 :(得分:5)

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

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

输出:

[3, 2]