我有两个清单。第一个是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
中删除。
为了解决真正的问题,我已经把代码拿出来了。
答案 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