2014-06-26 119 views
3

我想比较使用第一个列表的项目和第二个列表的索引的两个列表,并为每个匹配的第二个列表追加新的列表。比较python中的另一个列表的索引列表项

a = [[1],[0],[0]] 
b = [[1,2],[3,4],[5,6]] 
c = [] 
for item in a: 
    for i in range(len(b)): 
      if item == b[i]: 
       c.append(b[i]) 

答案应该是这样的:

c = [[3,4],[1,2],[1,2]] 
+0

请问你的代码的工作? –

+0

代码返回空列表 – Moj

+0

不,它不起作用,它返回[] – user3748972

回答

1

你的算法是正确的差不多。问题在于if语句。如果您在测试平等之前尝试打印itemb[i],您会看到问题。

>>> a = [[1],[0],[0]] 
>>> b = [[1,2],[3,4],[5,6]] 
>>> c = [] 
>>> for item in a: 
>>>  for i in range(len(b)): 
>>>   print("item == b[i] is {} == {} is {}".format(item, b[i], 
         item == b[i])) 
>>>   if item == b[i]: 
>>>    c.append(b[i]) 
item == b[i] is [1] == [1, 2] is False 
item == b[i] is [1] == [3, 4] is False 
item == b[i] is [1] == [5, 6] is False 
item == b[i] is [0] == [1, 2] is False 
item == b[i] is [0] == [3, 4] is False 
item == b[i] is [0] == [5, 6] is False 
item == b[i] is [0] == [1, 2] is False 
item == b[i] is [0] == [3, 4] is False 
item == b[i] is [0] == [5, 6] is False 

你已经基本上被检查的ab平等每个元素。相反,您要检查a的每个项目中的元素是否与b的索引相同。

例如。

for item_a in a: 
    for index_b, item_b in enumerate(b): 
     # only check index 0 of item_a as all lists are of length one. 
     print("item_a[0] == index_b is {} == {} is {}".format(item_a[0], 
        index_b, item_a[0] == index_b)) 
     if item_a[0] == index_b: 
      c.append(item_b) 

生产:

item_a[0] == index_b is 1 == 0 is False 
item_a[0] == index_b is 1 == 1 is True 
item_a[0] == index_b is 1 == 2 is False 
item_a[0] == index_b is 0 == 0 is True 
item_a[0] == index_b is 0 == 1 is False 
item_a[0] == index_b is 0 == 2 is False 
item_a[0] == index_b is 0 == 0 is True 
item_a[0] == index_b is 0 == 1 is False 
item_a[0] == index_b is 0 == 2 is False 

enumerate是一个内置的辅助函数返回包含在列表中(或任何可迭代是)的每个元素的索引和元素的元组。

除非你需要,我还建议flattening a作为嵌套列表在这里是多余的,即。 a = [1, 0, 0]。说完这一切之后,如果你可以让自己的头脑清楚理解,那么对解决方案进行编码会简单得多 - 正如你的问题的其他答案所证明的那样。

+0

谢谢,你的解释帮助我更好地理解它 – user3748972

+0

没问题,你说你刚刚开始,所以我觉得你真的很期待为什么你的代码不工作,而不是实际的答案。 – Dunes

+0

如有疑问,请打印出来! –

2
In [1]: a = [[1],[0],[0]] 

In [2]: b = [[1,2],[3,4],[5,6]] 

In [3]: [b[x[0]] for x in a] 
Out[3]: [[3, 4], [1, 2], [1, 2]] 
+2

为什么嵌套的解析?只是'[b [x [0]]为' – georg

+0

@ thg435好点,改变了 –

+0

哦!我的!,谢谢你sooo much ..我可能看起来很傻,但我是全新的编程,特别是在蟒蛇,再次感谢你 – user3748972

4

最简单的:

c = [b[i[0]] for i in a] 

我建议增加范围的检查,但:

c = [b[i[0]] for i in a if (0 <= i[0] < len(b))] 

编辑:基于您的澄清a,我建议改变:

def findInstances(list1, list2): 
    for i in list1: 
     yield [pos for pos,j in enumerate(list2) if i==j] # This yields a list containing the value you want 

到:

def findInstances(list1, list2): 
    for i in list1: 
     if (i in list2): 
      yield list2.index(i) # This yields only the value you want 

这将汇整清单,使问题更简单。然后,您可以使用以下方法:基于您是如何得到a

c = [b[i] for i in a if (0 <= i < len(b))] 

,范围检查实际上是不必要的。尽管如此,我还是留下了他们,以防万一以不同的方式得到a。使用

2

numpy的索引:

>>a = np.asarray(a) 
>>b = np.asarray(b) 
>>b[a] 
array([[[3, 4]], 

     [[1, 2]], 

     [[1, 2]]]) 
0

这是我如何比较另两个不同的列表。

def findInstances(list1, list2): 
    for i in list1: 
    yield [pos for pos,j in enumerate(list2) if i==j] 


list1 = [0.1408, 0.1456, 0.2118, 0.2521, 0.1408, 0.2118] 
list2 = [0.1408, 0.1456, 0.2118, 0.2521, 0.1254, 0.1243] 
list3 = [[1,2],[3,4],[5,6],[7,8],[9,10],[11,12]] 
res = list(findInstances(list1, list2)) 

和资源产生的输出作为“A”中的第一个问题

谢谢

+0

我更新了我的答案,并提供了findInstances函数的建议。 –