您要求的是嵌套列表。
让我尝试逐步回答这个问题,涵盖以下主题:
- For 循环
- 列表推导
- 嵌套 for 循环和列表推导
For 循环
您有这个列表:lst = [0,1,2,3,4,5,6,7,8],并且您想一次迭代列表一项并将它们添加到新列表中。你做一个简单的 for 循环:
lst = [0,1,2,3,4,5,6,7,8]
new_list = []
for lst_item in lst:
new_list.append(lst_item)
你可以用列表推导做同样的事情(它更 Pythonic)。
列表理解
列表推导是一种(*有时)更简单、更优雅的创建列表的方式。
new_list = [lst_item for lst_item in lst]
你这样读:对于lst中的每个lst_item,将lst_item添加到new_list
嵌套列表
什么是嵌套列表?
一个简单的定义:它是一个包含子列表的列表。您在另一个列表中有列表。
*根据您与谁交谈,嵌套列表是列表推导式比常规 for 循环更难阅读的情况之一。
假设您有这个嵌套列表:nested_list = [[0,1,2], [3,4,5], [6,7,8]],并且您想将其转换为类似这样的扁平列表:flattened list = [0,1,2,3,4,5,6,7,8]。
如果您使用与以前相同的 for 循环,您将无法获得它。
flattened_list = []
for list_item in nested_list:
flattened_list.append(list_item)
为什么? 因为每个list_item 实际上都是子列表之一。在第一次迭代中,你得到[0,1,2],然后是[3,4,5],最后是[6,7,8]。
你可以这样检查:
nested_list[0] == [0, 1, 2]
nested_list[1] == [3, 4, 5]
nested_list[2] == [6, 7, 8]
您需要一种方法进入子列表并将每个子列表项添加到flattened list。
How? 你增加了一层额外的迭代。实际上,您为每一层子列表添加一个。
在上面的示例中,您有两个层。
for 循环解决方案。
nested_list = [[0,1,2], [3,4,5], [6,7,8]]
flattened_list = []
for sublist in nested_list:
for item in sublist:
flattened_list.append(item)
让我们大声朗读这段代码。
for sublist in nested_list: 每个子列表是[0,1,2]、[3,4,5]、[6,7,8]。在第一个循环的第一次迭代中,我们进入[0,1,2]。
for item in sublist:[0,1,2]的第一项是0,它附加在flattened_list之后。然后是1,最后是2。
到目前为止,flattened_list 是 [0,1,2]。
我们完成了第二个循环的最后一次迭代,所以我们进入第一个循环的下一次迭代。我们进去[3,4,5]。
然后我们转到此子列表的每个项目并将其附加到flattened_list。然后我们进行下一次迭代,依此类推。
如何使用列表理解来做到这一点?
列表理解解决方案。
flattened_list = [item for sublist in nested_list for item in sublist]
你是这样读的:从nested_list 的每个sublist 中添加每个item。
它更简洁,但如果你有很多层,它可能会变得更难阅读。
让我们一起看看
#for loop
nested_list = [[0,1,2], [3,4,5], [6,7,8]]
flattened_list = []
for sublist in nested_list:
for item in sublist:
flattened_list.append(item)
----------------------------------------------------------------------
#list comprehension
flattened_list = [item for sublist in nested_list for item in sublist]
您将添加更多的迭代层for x in y。
2021 年 4 月编辑。
您可以使用 Numpy 展平嵌套列表。从技术上讲,在 Numpy 中,该术语将是 'array'。
对于一个小列表来说,这是一个矫枉过正,但如果你在一个列表中处理数百万个数字,你可能需要 Numpy。
来自 Numpy 的 documentation。我们有一个attributeflat
b = np.array(
[
[ 0, 1, 2, 3],
[10, 11, 12, 13],
[20, 21, 22, 23],
[30, 31, 32, 33],
[40, 41, 42, 43]
]
)
for element in b.flat:
print(element)
0
1
2
...
41
42
43