我想比较这样的名单不同的元素:返回列表发帖
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。所有其他元素都是相同的。有这个功能吗?
最好的,美国
我想比较这样的名单不同的元素:返回列表发帖
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]
究竟什么是该做的?
EDIT
由于罗马的评论,这更简单,但也是一样的。
>>> [index for (index, _) in set(enumerate(A)) - set(enumerate(B))]
[5, 7]
注意的是,虽然zip
产生一个列表,enumerate
产生一个枚举,它会立即列举打造的列表。它也会产生类型(index, value)
而不是(value, index)
,如上面的答案。
'拉链(A,x范围(LEN(A)))''是枚举(A)' – 2012-03-28 08:34:01
确定,但我错过的xrange功能。它在哪个模块中? – user366121 2012-03-28 08:35:45
xrange是在标准库中 – vascop 2012-03-28 08:37:21
你是否一定想要一个单行?因为否则还有更多简单的代码:
for i in range(len(A)):
if A[i]!=B[i]:
print i
这是确定了。 Thx – user366121 2012-03-28 08:43:55
类似的东西应该做的伎俩(未经测试):
[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]]
其它的(也许更易读?)的一行:
>>> [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)]
然后附加一个指数与项目10个功能:
[(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比较的指标建立在项目不匹配的列表中的项目。
为什么不是B的索引5或A的索引7?你在假设任何模式? – 2012-03-28 08:42:19
没有图案。只要算。 – user366121 2012-03-28 09:05:37