【问题标题】:Accessing content of each list of a list of list in Python在Python中访问列表列表的每个列表的内容
【发布时间】:2011-06-17 15:03:51
【问题描述】:

这样打印看起来有点绕,但我想要的应该很简单。 我有一个 Python 列表。

假设list = [[A, B, C], [D, B], [E], [X, Y, Z]]

我想按照一定的顺序迭代每个内部列表的元素 我试过了

for i in range(0, 10):
    for item in list[i]:
        <do action on item>

但是我从指向list[i] 的 Python 中得到一个语法错误,似乎不太喜欢它。

编辑:我想一次遍历一个内部列表 例如:

for i in range(0, 1):
    print i
    for item in list[i] #or something that works..
        print item

会打印

0
A
B
C
1
D
B

知道为什么会阻塞吗?

而且回溯只是说那里存在语法错误......

重新编辑:我通过使用其他数据结构解决了我的问题。这有点过于复杂了。很抱歉浪费您的时间,但还是感谢您的提示!

【问题讨论】:

  • 什么是错误,回溯?
  • 也许只是添加缺少的冒号?如果您真的向我们展示了完整的回溯,那么解决这个问题只需几秒钟。拒绝这样做是在浪费时间。
  • 这只是因为我在每一行都引用了其他函数,我认为它有点过于复杂,我的问题只与这部分有关。我通过使用不同的结构解决了我的问题。

标签: python list loops


【解决方案1】:

这是因为您的外部列表只有 4 个元素,因此没有索引 4(或 5 或 6 等)。这就是您收到索引错误的原因。

类似这样:

L = [1, 2, 3] L[6] # L 没有第 6 个索引 回溯(最近一次通话最后): 文件“”,第 1 行,在 IndexError: 列表索引超出范围

你应该这样做,是这样的:

for sub_list in L:
    for item in sub_list:
        <do action on item>

回应您的修改:

请注意,不要使用类型作为变量名。所以不要调用你的列表列表。也许这就是一些不喜欢的来源。

如果错误是“类型不可下标”的结果,那么这正是您收到错误的原因。您可以通过将 list 的名称更改为其他名称来修复它 - 我会推荐 L

【讨论】:

  • 请注意,这种方法通常使遍历列表更容易。您不再需要担心跟踪列表的长度。使用迭代器来发挥自己的优势是 Python 惯用的关键。
  • 这确实是一个有用的注释。但就我而言,我认为这不是它崩溃的原因:当我尝试运行程序时出现错误。目前它甚至不知道列表有多长。顺便说一句,我编辑了我的帖子,提供了更多关于我想要做什么的细节
  • 我只是在这里的例子中使用了名单,我没有在我的代码中使用它。我的一段代码比那要复杂一些,所以我简化了它。
【解决方案2】:

你在找吗

for my_list in list_of_lists:
    for item in my_list:
        # whatever

【讨论】:

  • 另外,如果你想要item的索引,别忘了使用enumerate命令:for i, my_list in enumerate(list_of_lists):
  • 感谢所有快速回复,我意识到我不够清楚:我编辑了我的帖子
  • 这个答案如何无法完成您在编辑中设定的内容?
  • 因为我上面还有一个循环,它会迭代太多次。但这实现起来太复杂了,我找到了一种更简单的方法,不同的数据结构
【解决方案3】:

您想要的是链接子列表并进行迭代。 Itertools 模块有一个功能可以做到这一点,而且非常简单高效:

for item in itertools.chain.from_iterable(list_of_lists):
   <do action on item>

【讨论】:

  • itertools.chain(*list_of_lists):;使用from_iterable 似乎只有在您想要延迟评估/使用返回大量值的迭代时才真正有用。
【解决方案4】:

可能因为您使用了 range(0,10) 但您的列表没有 10 个条目而出现错误?

l = [['a', 'b', 'c'], ['d', 'b'], ['e'], ['x', 'y', 'z']]
for i in range (0,len(l)):
    for item in l[i]:
        print item

a
b
c
d
b
e
x
y
z

【讨论】:

    【解决方案5】:

    您的错误可能与i 大于内部列表的数量有关。为避免这种情况,您可以改用

    for inner in list:
        for item in inner:
            <do action on item>
    

    【讨论】:

      【解决方案6】:

      你也可以使用这样的东西:

      l = [['a', 'b', 'c'], ['d', 'b'], ['e'], ['x', 'y', 'z']]
      [val for row in l for val in row]
      

      或者如果您需要执行任何操作:

      for val in (val for row in l for val in row):
          # do smth
      

      或者:

      action = lambda x: str(x)+'_1'
      [map(lambda val: action(val), row) for row in l]
      

      或者:

      action = lambda x: str(x)+'_1'
      map(lambda row: map(lambda val: action(val), row), l)
      

      【讨论】:

      • 嵌套列表和生成器理解仍然有点让我失望,因为最终值在左侧,但内部循环向右进行。
      • @JAB 你是什么意思?我不确定我是否正确理解它是如何工作的
      • @Johanna: for row in l for val in row 等价于for row in l:\n\tfor val in row:
      猜你喜欢
      • 2023-03-09
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-04
      相关资源
      最近更新 更多