2

我有两个清单。第一个是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_listif中删除b[1] == a

为了解决真正的问题,我已经删除了该代码。

4

2 回答 2

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

对于您的示例数据。

于 2013-03-05T21:51:04.500 回答
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 解释:

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

对于 a[:] 中的 x:
如果 x < 0:a.remove(x)

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

于 2013-03-05T22:09:43.310 回答