1.问题引入:
将列表demo_list = [[1, 2, 3], [4, 5, 6], [-1, -2, -3]],每个元素拆开平铺成一个新列表(去掉内层的中括号)。
2.代码
from itertools import chain
"""
python实现嵌套列表的平铺
"""
demo_list = [[1, 2, 3], [4, 5, 6], [-1, -2, -3]]
# 方法一:使用双重for循环的列表推导式,注意观察两个for循环的前后位置(遍历一级元素的语句写在前面)
li1 = [num for elem in demo_list for num in elem]
# 方法二:使用sum函数,将此列表与空列表进行求和
li2 = sum(demo_list, [])
# 方法三:使用chain方法,将三个内层列表元素连起来,再迭代。
li3 = list(chain(*demo_list)) # 可以理解成拆包,拆成内部的每个列表元素
# 注意哦,如果不加*,意味着demo_list本身迭代,结果将是原列表
li4 = list(chain(demo_list))
print("1.列表推导式方法:%s" % li1)
print("2.使用sum函数:%s" % li2)
print("3.使用chain方法(注意拆包):%s" % li3)
print("4.使用chain方法(非拆包):%s" % li4)
结果:
1.列表推导式方法:[1, 2, 3, 4, 5, 6, -1, -2, -3]
2.使用sum函数:[1, 2, 3, 4, 5, 6, -1, -2, -3]
3.使用chain方法(注意拆包):[1, 2, 3, 4, 5, 6, -1, -2, -3]
4.使用chain方法(非拆包):[[1, 2, 3], [4, 5, 6], [-1, -2, -3]]
3.总结:
-
1.使用双重for循环的列表推导式:
注意两个for循环的前后位置(遍历一级元素的语句写在前面),这里吃过亏,顺序错了直接语法错误。 -
2.sum()方法:
"""
语法:
sum(iterable[, start])
参数:
iterable -- 可迭代对象,如:列表、元组、集合。
start -- 指定相加的参数,如果没有设置这个值,默认为0。
"""
print(sum([0, 1, 2])) # 3
print(sum((2, 3, 4), 5)) # 元组计算总和后再加 5 =14
# 列表里面必须都是嵌套列表,否则会出错,理解成sum()将可迭代对象的每个元素与[]进行相减即连接,最终结果就是一个平铺的列表。
print(sum([[0, 1], [2], [3, 4]], [])) # [0, 1, 2, 3, 4] 正确
print(sum([[0, 1], 2, [3, 4]], [])) # 报错 TypeError: can only concatenate(连接) list (not "int") to list
- 3.使用chain方法,将三个内层列表元素连起来,再迭代。
chain(*demo_list)
可以理解成拆包,拆成内部的每个列表元素,
注意:如果不加*
,意味着demo_list本身的一级元素迭代,结果将是原列表。