在列表列表中找不到值

时间:2013-03-05 21:45:12

标签: python list python-2.7 loops

我有两个清单。第一个是a_list,就像这样:

a_list = [1,2,3]

第二个是b_list,它是一个包含列表的列表。就像这样:

b_list = [['a',1,'b'],['c',2,'g'],['e',3,'5']

我要做的是使用a_list找到正确的b_list并打印value[2]中的b_list

我的代码如下:

for a in a_list:
    for b in b_list:
        if b[1] == a:
            print b[2]

实际a_list中有136个值。真正的b_list里面有315个列表。

我最初编写代码来索引b项,如果b_list,则将其从b[1] == a中删除。

为了解决真正的问题,我已经把代码拿出来了。

2 个答案:

答案 0 :(得分:5)

无需循环a_list;一个简单的in测试就足够了:

for b in b_list:
    if b[1] in a_list:
        print b[2]

如果您将a_list设置为

,那么效果会更好
a_set = set(a_list)

for b in b_list:
    if b[1] in a_set:
        print b[2]

无论哪种方式,此代码都会打印:

b
g
5

表示您的示例数据。

答案 1 :(得分:0)

如果我理解你想做什么:

a_list = [1,2,3,5]

b_list = [['a',1,'b'],['c',2,'g'],['e',3,'5'],
          ['d',4,'h'],['Z',5,'X'],['m',6,'i']]

print 'a_list ==',a_list
print '\nb_list before :\n',b_list

print '\nEnumerating b_list in reversed order :'
L = len(b_list)
print ('  i       el          L-i  b_list[L-i]  \n'
       '  -------------------------------------')
for i,el in enumerate(b_list[::-1],1):
    print '  %d  %r     %d  %r' % (i,el,L-i,b_list[L-i])


L = len(b_list)
for i,el in enumerate(b_list[::-1],1):
    if el[1] in a_list:
        del b_list[L-i]


print  '\nb_list after :\n',b_list

结果

a_list == [1, 2, 3, 5]

b_list before :
[['a', 1, 'b'], ['c', 2, 'g'], ['e', 3, '5'],
 ['d', 4, 'h'], ['Z', 5, 'X'], ['m', 6, 'i']]

Enumerating b_list in reversed order :
  i       el          L-i  b_list[L-i]  
  -------------------------------------
  1  ['m', 6, 'i']     5  ['m', 6, 'i']
  2  ['Z', 5, 'X']     4  ['Z', 5, 'X']
  3  ['d', 4, 'h']     3  ['d', 4, 'h']
  4  ['e', 3, '5']     2  ['e', 3, '5']
  5  ['c', 2, 'g']     1  ['c', 2, 'g']
  6  ['a', 1, 'b']     0  ['a', 1, 'b']

b_list after :
[['d', 4, 'h'], ['m', 6, 'i']]

必须以颠倒的顺序在b_list中迭代的原因是 abarnert 所说的并且在下文中由doc解释:

  

注意:当序列被修改时,有一个微妙的   循环(这只能发生在可变序列,即列表中)。一个   内部计数器用于跟踪下一个使用的项目,以及   这在每次迭代时递增。当这个计数器到达时   循环终止的序列长度。这意味着,如果   suite从序列中删除当前(或前一个)项目   将跳过下一个项目(因为它获取当前项目的索引   已经治疗了)。同样,如果套件插入一个   当前项目之前的序列中的项目,当前项目将是   下次循环再次治疗。这可能导致讨厌   使用切片制作临时副本可以避免的错误   整个序列,例如,

     

表示[:]中的x:
      如果x< 0:a.remove(x)

     

http://docs.python.org/2/reference/compound_stmts.html#the-for-statement