【问题标题】:How to iterate through a list that contains lists in python?如何遍历包含python中列表的列表?
【发布时间】:2018-06-11 23:53:33
【问题描述】:

我想知道如何在 python 中遍历包含列表的列表,但是我想使用使用索引的 for 循环方法,而不是在 python 中以正常方式进行迭代。有可能吗?

这里是python代码:

n = [[1, 2, 3], [4, 5, 6, 7, 8, 9]]

def flatten(my_lists):
  results = []
  for outer in range(len(my_lists)):
    for inner in range(len(outer)):
      results.append(lists[outer][inner])
  return results

print flatten(n)

这是我在控制台中遇到的错误:

Traceback (most recent call last):
  File "python", line 10, in <module>
  File "python", line 6, in flatten
TypeError: object of type 'int' has no len()

我的代码有什么错误?

提前致谢。

【问题讨论】:

标签: python list loops


【解决方案1】:

outerinner 都是 ints。因此,len(outer) 注定会失败:

results = []
  for outer in range(len(my_lists)):
    # you need the length of the list in position 'outer', not of 'outer' itself
    for inner in range(len(my_lists[outer])):  
      results.append(my_lists[outer][inner])
  return results

根本不使用索引更容易:

results = []
  for lst in my_lists:
    for x in lst:  
      results.append(x)
    # Or without inner loop
    # results.extend(lst)
  return results

此外,为了展平列表列表,有许多文档齐全的方法,一个简单的方法是嵌套理解,例如:

n = [[1, 2, 3], [4, 5, 6, 7, 8, 9]]
flat = [x for lst in n for x in lst]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

更多内容可以参考Making a flat list out of list of lists in PythonFlatten (an irregular) list of lists

【讨论】:

    【解决方案2】:

    这里是使用枚举的索引循环。

    n = [[8, 2, 3], [4, 5, 6, 7, 8, 9]]
    
    def flatten(my_lists):
      results = []
      for idx, outer in enumerate(my_lists):
        for idx2, inner in enumerate(outer):
          results.append(my_lists[idx][idx2])
      return results
    
    print flatten(n)
    

    idx 和 idx2 是 for 循环的当前索引

    【讨论】:

      【解决方案3】:

      除了其他答案,还有使用itertools的标准库解决方案。

      >>> import itertools
      >>> n = [[1, 2, 3], [4, 5, 6, 7, 8, 9]]
      >>> print(list(itertools.chain(*n)))
      [1, 2, 3, 4, 5, 6, 7, 8, 9]
      

      或者(可能)更明确

      >>> from itertools import chain
      >>> n = [[1, 2, 3], [4, 5, 6, 7, 8, 9]]
      >>> print(list(chain.from_iterable(n)))
      [1, 2, 3, 4, 5, 6, 7, 8, 9]
      

      如果您只需要扁平化的“列表”可迭代,则可以省略 list 调用并使用返回的 itertools.chain 对象。

      >>> chain.from_iterable(n)
      <itertools.chain object at 0x7f2ecc05f668>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-26
        • 1970-01-01
        • 2016-08-27
        • 2011-09-14
        • 2022-11-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多