【问题标题】:Python maintain order in intersection of listsPython维护列表交集的顺序
【发布时间】:2015-06-27 15:11:31
【问题描述】:

我有一个列表A 和列表B,我想从这两个列表中获取公共元素,但是当我获得公共元素时,它们应该保持列表A 的顺序。

首先,我开始将它们转换为集合并采取交叉点,但这存在维持秩序的问题。

common = list(set(A).intersection(set(B)))

所以我决定做列表理解:

common = [i for i in A if i in B]

我来了

IndexError: too many indices for array

【问题讨论】:

  • 您的错误与您的理解陈述无关。
  • 我实际上认为这不是重复的,因为 OP 希望保持原始顺序,而链接问题的答案都没有。
  • 无法复制。 A = [1, 2, 3, 3, 2]B = [2, 3][i for i in A if i in B] 给出[2, 3, 3, 2]。您能否提供示例数据来重现您的问题?
  • @AlexA。非常感谢您没有这么快就将其注销为副本。我认为你使用的标题正是我最初应该使用的。

标签: python list


【解决方案1】:

作为此类问题的一般答案您可以使用 sorted 函数和 lambda x:A.index(x) 作为其键,它将根据列表 A 的顺序对结果进行排序:

>>> common = sorted(set(A).intersection(B) ,key=lambda x:A.index(x))

另外注意您不需要使用set(B) 进行交集。

【讨论】:

  • intersection(B) 应该是 intersection(set(B)) 吗?或者你假设 B 已经是一个集合..?
  • @Null-Hypothesis:只要A是一个集合,它就有一个交集方法。像这里所做的那样在集合和列表之间进行交集是合法的。
  • key=A.index 应该可以在不使用 lambda 的情况下工作。我认为使用A.index 进行排序会将性能特征更改为二次方,这对于非常大且具有大交叉点的情况来说不太理想。
【解决方案2】:

您的代码 (common = [i for i in A if i in B]) 运行良好。也许您在问题中写的不是引发IndexError 的确切代码。

您可以通过从B 生成set 来加快成员资格测试:

set_b = set(B)
common = [i for i in A if i in set_b]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多