【问题标题】:python find differing elements in listpython在列表中查找不同的元素
【发布时间】:2012-04-11 19:44:16
【问题描述】:

我想比较这类列表:

A = [0,1,0,1,0,1,0,0,0,1,0,1,0,1,0]
B = [0,1,0,1,0,0,0,1,0,1,0,1,0,1,0]

并找出哪些元素不同。在这种情况下,它应该返回 A 的索引 5 和 B 的索引 7。所有其他元素都是相同的。有这个功能吗?

最好的,美国

【问题讨论】:

  • 为什么不是 B 的索引 5 或 A 的索引 7?你假设有什么模式吗?

标签: python list function


【解决方案1】:
>>> [index for (_, index) in set(zip(A, xrange(len(A)))) - set(zip(B, xrange(len(B))))]
[5, 7]

这到底是在做什么?

  1. 用递增的数字压缩列表。因此,生成一个元组列表,其中第一个值是列表中的元素,第二个是它的索引。
  2. 为每个创建集合,以便将它们与集合函数进行比较。元组是不可变的,因此是可散列的,因此可以存储在一个集合中
  3. 取两者的差值
  4. 挑选出不同项目的索引

编辑

感谢 Roman 的评论,这更简单,但做同样的事情。

>>> [index for (index, _) in set(enumerate(A)) - set(enumerate(B))]
[5, 7]

请注意,zip 会生成一个列表,而enumerate 会生成一个可枚举,它会立即被枚举以构建列表。它还生成(index, value) 类型的元组,而不是上面答案中的(value, index)

【讨论】:

  • zip(A, xrange(len(A)))enumerate(A)
  • 好的,但我想念 xrange 函数。它在哪个模块中?
  • xrange 在标准库中
  • 谢谢!这几乎是正确的。它与zip(xrange(len(A), A)) 相同,并生成可枚举而不是列表。我已将其纳入我的答案中。
  • @VascoP 在 Python 2.x 中,而不是在 Python 3 中。
【解决方案2】:

你一定要单线吗?因为否则还有更简单的代码:

for i in range(len(A)):
    if A[i]!=B[i]:
        print i

【讨论】:

    【解决方案3】:

    另一个(也许更易读?)单行:

    >>> [index for (index,(a,b)) in enumerate(zip(A,B)) if a!=b]
    [5, 7]
    

    这首先将列表压缩在一起:

    [(0, 0), (1, 1), (0, 0), (1, 1), (0, 0), (1, 0), (0, 0), (0, 1), (0, 0), 
    (1, 1), (0, 0), (1, 1), (0, 0), (1, 1), (0, 0)]
    

    然后使用enumerate() 函数将索引附加到项目:

    [(0, (0, 0)), (1, (1, 1)), (2, (0, 0)), (3, (1, 1)), (4, (0, 0)), (5, (1, 0)), 
    (6, (0, 0)), (7, (0, 1)), (8, (0, 0)), (9, (1, 1)), (10, (0, 0)), (11, (1, 1)), 
    (12, (0, 0)), (13, (1, 1)), (14, (0, 0))]
    

    然后它使用一个相当标准的list comprehension 来比较项目,并构建一个项目不匹配的索引列表。

    【讨论】:

    • 你的回答和我的很相似。你同意吗?
    • 我同意。你的帖子是在我写我的时候发布的……你想让我删除我的答案吗?
    • 然后你写你的答案 20 分钟直到你发布它;)不,如果你希望它留下来,那么不要删除它。但请添加一些值,以免其他人将其视为“复制和粘贴”答案。
    • 它被发布为未经测试,因为我是在手机上写的。我花时间把它写在一个小键盘上。但无论如何感谢您测试我的答案,我会更新它并声明它已经过测试;)
    • 酷,没问题@Tadeck。我只能说,你一定有一部非常漂亮的手机,并且非常渴望接听……我向你致敬!
    【解决方案4】:

    类似的东西应该可以解决问题(未经测试):

    [i for i, v in enumerate(zip(A, B)) if sum(v) == 1]
    

    这将返回每个列表中具有不同值的元素数量的列表。

    如果您的数据集与问题中的不同,那么您可以使用这个:

    [i for i, v in enumerate(zip(A, B)) if v[0] != v[1]]
    

    【讨论】:

    • 只要是1和0就行!
    • @jamylak:这意味着“与问题完全一样!”:)
    • 除非有人试图在两种不同类型的列表中找到不同的项目,没关系哈哈哈
    • @jamylak:“两种不同类型的列表”?在 Python 中,list 是一种类型,没有“两种类型的列表”,除非您考虑到元组,但它在这里的行为方式相同,dict 或 set,但它们绝对不是列表(请参阅一些 Python 教程有关详细信息),或者只是一个序列,但将其称为列表将是一个重大误解。
    • 不,我的意思是不同,因为不是 1 和 0,例如。 [2,0,2] [0,0,2] 总和不等于 1...啊,别担心,这完全是个大误会...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多