【问题标题】:Removing common values from two lists in python从python中的两个列表中删除公共值
【发布时间】:2017-05-17 20:06:13
【问题描述】:

嗨,假设我在 python 中有两个列表,我想从两个列表中删除公共值。一个潜在的解决方案是:

x = [1, 2, 3, 4, 5, 6, 7, 8]
y = [43, 3123, 543, 76, 879, 32, 14241, 342, 2, 3, 4]
for i in x:
    if i in y:
        x.remove(i)
        y.remove(i)

这似乎是正确的,但事实并非如此。我想,原因是通过从列表中删除一个项目,索引会继续迭代。因此,对于列表中的两个常见值,如果它们的值彼此接近,我们将丢失后面的值(代码不会遍历它)。 结果是:

>>> x
[1, 3, 5, 6, 8, 9, 10]
>>> y
[43, 3123, 543, 76, 879, 32, 14241, 342, 3]

所以我们缺少值'3'

这种行为的原因是我提到的原因吗?还是我做错了什么?

【问题讨论】:

  • 是的,这正是您在迭代对象时修改对象会遇到的问题。
  • 强烈建议不要修改您正在迭代的值。对于任何试图理解你的代码在做什么的人来说,这可能会让你很难确定循环的流程。在这种情况下,通常建议对列表(或其他可迭代对象)的单独副本进行修改或迭代索引以切入列表:for i in range(len(x)): print(x[i])

标签: python python-2.7 list


【解决方案1】:

您还可以使用set 对象的差异。

a = list(set(y) - set(x))
b = list(set(x) - set(y))

【讨论】:

  • 这样做的一个缺点是它会删除所有重复的项目并丢失排序。但通常对于想要这样做的人来说,这不是问题
【解决方案2】:

我个人认为 Python 的 set 数据类型是要走的路:

你可以这样做:

>>> x = [1, 2, 3, 4, 5, 6, 7, 8]
>>> y = [43, 3123, 543, 76, 879, 32, 14241, 342, 2, 3, 4]
>>> sx = set(x)
>>> sy = set(y)
>>> sx.union(sy)
set([1, 2, 3, 4, 5, 6, 7, 8, 32, 43, 76, 342, 543, 879, 3123, 14241])

或者您可以将其简化为一个衬里:

list(set(x).union(set(y)))

【讨论】:

    【解决方案3】:

    只需稍微更改您的代码,遍历x 的副本x[:]。您正在修改列表,同时迭代它。所以这就是为什么你缺少价值3

    for i in x[:]:
          if i in y:
              x.remove(i)
              y.remove(i)
    

    另一种方法

    x,y = [i for i in x if i not in y],[j for j in y if j not in x]
    

    【讨论】:

    • 如果任何列表中存在重复值,这不起作用,请尝试:x = [1, 2, 3, 4, 5, 6, 7, 8, 3] 你还必须复制 y
    • @DSLima90 我认为这符合 OP 的要求,如果他想删除所有出现的重复项,这是行不通的。但是在从两个列表中删除之后,它在第一个列表中是唯一的。所以这不是问题。
    • @Rhaul 是的,你是对的。我假设 OP 希望通过我对提供的代码的解释来删除所有出现的事件。这是一个有效的答案,尽管可能值得注意的是它与迄今为止在这方面的其他答案不同。
    • @DSLima90 也许你是对的。无论如何我都用另一种方法更新了
    【解决方案4】:
    z=[i for i in x if i not in y]
    w=[i for i in y if i not in x]
    x=z
    y=w
    

    这应该可以解决问题吗?它的内存效率有点低。

    【讨论】:

    • 这个可以压缩成x, y = [i for i in x if i not in y], [i for i in y if i not in x]
    【解决方案5】:

    如果你使用numpy,那么你只需要:

    x, y = np.setdiff1d(x, y), np.setdiff1d(y, x)
    

    如果你不想使用 numpy:

    x, y = list(set(x).difference(y)), list(set(y).difference(x))
    

    【讨论】:

      【解决方案6】:

      您可以使用set 方法删除列表中的元素。

      s1=input()
      s2=input()
      str=list(set(s1).symmetric_difference(set(s2)))
      print(str)
      

      【讨论】:

        猜你喜欢
        • 2016-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-04
        • 1970-01-01
        • 2012-12-07
        相关资源
        最近更新 更多