Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在列表列表中查找值时遇到问题_Python_List_Python 2.7_Loops - Fatal编程技术网

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_列表
进行测试。