我知道在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
而不是frozenset
也能工作,我只是越来越习惯于在不想改变数据的情况下使用不可变类。关键是,要保持顺序,您需要按照您希望保持的顺序遍历列表,但您不希望具有天真方法的n*m复杂性:[x for x in list_1 if x in list_2]
。在set
或类似的基于散列的类型中检查成员关系大约是O(1),而在列表中检查成员关系大约是O(n)。相关问题 更多 >
编程相关推荐