Python 在列表列表中查找值时遇到问题
我有两张单子。第一个是Python 在列表列表中查找值时遇到问题,python,list,python-2.7,loops,Python,List,Python 2.7,Loops,我有两张单子。第一个是a_列表,如下所示: a_list = [1,2,3] b_list = [['a',1,'b'],['c',2,'g'],['e',3,'5'] 第二个是b_list,它是一个包含列表的列表。是这样的: a_list = [1,2,3] b_list = [['a',1,'b'],['c',2,'g'],['e',3,'5'] 我试图做的是使用a_列表找到正确的b_列表,并在b_列表中打印值[2] 我的代码如下所示: for a in a_list: fo
a_列表
,如下所示:
a_list = [1,2,3]
b_list = [['a',1,'b'],['c',2,'g'],['e',3,'5']
第二个是b_list
,它是一个包含列表的列表。是这样的:
a_list = [1,2,3]
b_list = [['a',1,'b'],['c',2,'g'],['e',3,'5']
我试图做的是使用a_列表
找到正确的b_列表
,并在b_列表
中打印值[2]
我的代码如下所示:
for a in a_list:
for b in b_list:
if b[1] == a:
print b[2]
实际上a_列表中有136个值。而真正的b_列表中有315个列表
我最初编写了代码来索引b项,并将其从b_列表中删除,如果b[1]==a
为了解决真正的问题,我已经删除了该代码。没有必要在列表上循环;在
中进行一次简单的测试即可:
for b in b_list:
if b[1] in a_list:
print b[2]
如果您将a_列表
a集合:
a_set = set(a_list)
for b in b_list:
if b[1] in a_set:
print b[2]
无论哪种方式,此代码都会打印:
b
g
5
对于您的示例数据。如果我正确理解了您想要做的事情:
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_列表中按相反顺序迭代的原因是abarnert所说的,下文由doc解释:
注意:当序列被
循环(这仅适用于可变序列,即列表)。一
内部计数器用于跟踪下一个使用的项目,以及
这在每次迭代中递增。当这个计数器到达
循环终止的序列长度。这意味着如果
套件从序列中删除当前(或上一个)项
将跳过下一项(因为它获取当前项的索引)
这已经得到了治疗)。同样,如果套件插入
在当前项之前的序列中,当前项将
下次通过循环再次处理。这会导致严重的后果
可以通过使用一个片段创建临时副本来避免的bug
整个序列,例如
对于[:]:
如果x<0:a.移除(x)
真正的问题是什么?“我最初编写的代码是为b
项编制索引,并将其从b_列表中删除,如果b[1]==a
”,一旦您解决了这个问题并尝试恢复该代码,您就会遇到另一个问题。迭代时不能从列表中删除元素。但是如果你看看右边的相关问题,你会很快找到解决方案。tl;dr是:b\u list=[b代表b\u list中的b,如果b[1]在b\u list中]
,或者对filter
的等效调用。如果b\u list中的值在b\u list中有多个列表,这会起作用吗?@TDNS:没有理由不起作用。b_列表
中的每个子列表分别根据未更改的a_集
或a_列表
进行测试。