【问题标题】:Trouble find value in list of lists无法在列表列表中找到值
【发布时间】:2013-02-20 12:00:48
【问题描述】:

我有两个列表。第一个是a_list,是这样的:

a_list = [1,2,3]

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

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

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

我的代码如下:

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

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

【问题讨论】:

  • 真正的问题是什么?你没有说明哪里出了问题。
  • "我最初编写了代码来索引 b 项目,如果 b[1] == a 将其从 b_list 中删除。"一旦你解决了这个问题并尝试恢复该代码,你就会遇到另一个问题。您不能在迭代 list 时从它中删除元素。但是,如果您查看右侧的相关问题,您会很快找到解决方案。 tl;dr 是:b_list = [b for b in b_list if b[1] in a_list],或对 filter 的等效调用。

标签: python list python-2.7 loops


【解决方案1】:

不需要循环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

为您的示例数据。

【讨论】:

  • 如果 a_list 中的值在 b_list 中有多个列表,这会起作用吗?
  • @TDNS:没有理由不工作。 b_list 中的每个子列表分别针对 a_seta_list 进行测试,不会更改。
【解决方案2】:

如果我理解正确你想做什么:

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说的,后面由文档解释:

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

对于 a[:] 中的 x:
如果 x

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

【讨论】:

    猜你喜欢
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    相关资源
    最近更新 更多