2012-03-28 62 views
2

我想比较这样的名单不同的元素:返回列表发帖

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

最好的,美国

+0

为什么不是B的索引5或A的索引7?你在假设任何模式? – 2012-03-28 08:42:19

+0

没有图案。只要算。 – user366121 2012-03-28 09:05:37

回答

4
>>> [index for (_, index) in set(zip(A, xrange(len(A)))) - set(zip(B, xrange(len(B))))] 
[5, 7] 

究竟什么是该做的?

  1. 用增加的数字压缩列表。所以,产生一个元组列表,其中第一个值是列表中的元素,第二个是它的索引。
  2. 创建每个集合,因此可以将它们与集合函数进行比较。元组是不可改变的,因此可哈希,因此可被存储在一组
  3. 取上述两种
  4. 之间的差集挑选出的不同项目的索引

EDIT

由于罗马的评论,这更简单,但也是一样的。

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

注意的是,虽然zip产生一个列表,enumerate产生一个枚举,它会立即列举打造的列表。它也会产生类型(index, value)而不是(value, index),如上面的答案。

+2

'拉链(A,x范围(LEN(A)))''是枚举(A)' – 2012-03-28 08:34:01

+0

确定,但我错过的xrange功能。它在哪个模块中? – user366121 2012-03-28 08:35:45

+0

xrange是在标准库中 – vascop 2012-03-28 08:37:21

1

你是否一定想要一个单行?因为否则还有更多简单的代码:

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

这是确定了。 Thx – user366121 2012-03-28 08:43:55

1

类似的东西应该做的伎俩(未经测试):

[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

只要它只有1s和0s! – jamylak 2012-03-28 09:25:13

+0

@jamylak:这意味着“_exactly如问题_!” :) – Tadeck 2012-03-28 10:56:59

+0

,除非有人试图找出两种不同类型的列表的不同项目,请不要介意哈哈哈 – jamylak 2012-03-28 10:59:55

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比较的指标建立在项目不匹配的列表中的项目。

+0

你的答案是非常类似地雷。你同意吗? – Tadeck 2012-03-28 09:15:10

+0

我同意。你写的是我写我的时候......你想让我删除我的回答吗? – 2012-03-28 09:17:25

+0

然后你写了你的答案20分钟,直到你发布它;)不,如果你想它留下,那么不要删除它。但请添加一些价值,以免被他人视为“复制和粘贴”答案。 – Tadeck 2012-03-28 09:20:53