Python中两个列表的有序交集

2024-05-14 21:37:09 发布

您现在位置: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]

是否有一种替代的交集技术可以使生成的“交集”与第一个列表保持相同的顺序?


Tags: 方法订单列表顺序技术listset交叉点
2条回答

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

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

输出:

[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]。在set或类似的基于散列的类型中检查成员关系大约是O(1),而在列表中检查成员关系大约是O(n)。

相关问题 更多 >

    热门问题