Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python在列表中查找不同的元素_Python_List_Function - Fatal编程技术网

python在列表中查找不同的元素

python在列表中查找不同的元素,python,list,function,Python,List,Function,我想比较这类列表: 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。所有其他元素都是相同的。有没有这个功能 最好的,我们 >>> [index for (_, index) in set(zip(A, xrange(len(A)))) - set(zip(B, xrange(len(B))))] [5, 7] 这到底

我想比较这类列表:

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。所有其他元素都是相同的。有没有这个功能

最好的,我们

>>> [index for (_, index) in set(zip(A, xrange(len(A)))) - set(zip(B, xrange(len(B))))]
[5, 7]
这到底在干什么

  • 用递增的数字压缩列表。因此,生成一个元组列表,其中第一个值是列表中的元素,第二个值是其索引
  • 创建每个函数的集合,以便与集合函数进行比较。元组是不可变的,因此可以散列,因此可以存储在一个集合中
  • 取两者之间的设定差
  • 挑出不同项目的索引
  • 编辑

    多亏了罗曼的评论,这更简单了,但做了同样的事情

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

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

    您一定要一行吗?因为除此之外还有更简单的代码:

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

    像这样的东西应该可以奏效(未经测试):

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

    如果您的数据集与问题中的不同,则您可以使用:

    [i for i, v in enumerate(zip(A, B)) if v[0] != v[1]]
    
    另一个(也许更可读?)一行:

    >>> [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))]
    

    然后,它使用一个比较标准来比较项目,并在项目不匹配的地方构建一个索引列表。

    zip(a,xrange(len(a))
    enumerate(a)
    可以,但我错过了xrange函数。它在哪个模块中?xrange在标准库中,谢谢!这几乎是正确的。它与
    zip(xrange(len(A),A))
    相同,生成一个可枚举的而不是列表。我已经将其纳入了我的答案中。@VascoP在Python2.x中,而不是在Python3中。为什么不使用B的索引5或A的索引7呢?你在假设什么模式吗?你的答案和我的很相似。你同意吗?我同意。你的是在我写我的文章时发布的。。。你想让我删除我的答案吗?然后你写了20分钟的答案,直到你把它贴出来;)不,如果您希望它保留,请不要删除它。但请添加一些值,这样其他人就不会将其视为“复制粘贴”答案。它被贴为未经测试,因为我是在手机上写的。我花时间把它写在一个小键盘上。但无论如何,谢谢你测试我的答案,我会用已经测试过的声明来更新它;)很酷,没问题@Tadeck。我所能说的就是,你一定有一部非常花哨的电话,而且非常渴望接听。。。我向你致敬!只要它只有1和0@贾米拉克:这意味着“与问题完全一样!”:)除非有人试图在两种不同类型的列表中找到不同的项目,别担心hahaha@jamylak:“两种不同类型的列表”?在Python中,列表是一种类型,没有“两种类型的列表”,除非您考虑了tuple,但在这里它的行为方式相同,dict或set,但它们绝对不是列表(有关详细信息,请参阅一些Python教程),或者只是一个序列,但这将是一个很大的误解,称之为列表。不,我的意思是不同的,因为不是1和0,例如[2,0,2][0,0,2],这不等于1。。。啊,别担心,这都是一个很大的误会。。。
    [(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))]