我想与列表进行比较并返回不同的索引和元素。
所以我写下面的代码:
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)
这样的三元表达式(不像我做的那样最简单。我想排除它。)非常感谢病人! :)
答案 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))]