比较列表并返回python中的不同索引和元素

时间:2015-03-26 11:31:10

标签: python

我想与列表进行比较并返回不同的索引和元素。

所以我写下面的代码:

l1 = [1,1,1,1,1]
l2 = [1,2,1,1,3]

ind = []
diff = []

for i in range(len(l1)):
    if l1[i] != l2[i]:
        ind.append(i)
        diff.append([l1[i], l2[i]])

print ind
print diff

# output: 
# [1, 4]
# [[1, 2], [1, 3]]

代码有效,但还有更好的方法吗?


更新问题:

我想要求另一个解决方案,例如使用迭代器,或者像[a,b](expression)这样的三元表达式(不像我做的那样最简单。我想排除它。)非常感谢病人! :)

3 个答案:

答案 0 :(得分:2)

您可以使用列表推导将所有信息输出到单个列表中。

>>> [[idx, (i,j)] for idx, (i,j) in enumerate(zip(l1, l2)) if i != j]
[[1, (1, 2)], [4, (1, 3)]]

这将产生一个列表,其中每个元素都是:[index, (first value, second value)]所以关于单个差异的所有信息都在一起。

答案 1 :(得分:2)

另一种方法是以下

>>> l1 = [1,1,1,1,1]
>>> l2 = [1,2,1,1,3]
>>> z = zip(l1,l2)
>>> ind = [i for i, x in enumerate(z) if x[0] != x[1]]
>>> ind
[1, 4]
>>> diff = [z[i] for i in ind]
>>> diff
[(1, 2), (1, 3)]

在Python3中,您必须在list周围添加对zip的调用。

答案 2 :(得分:1)

您可以尝试功能风格:

res = filter(lambda (idx, x): x[0] != x[1], enumerate(zip(l1, l2)))
# [(1, (1, 2)), (4, (1, 3))]

解压缩res您可以使用:

 zip(*res)
 # [(1, 4), ((1, 2), (1, 3))]