python - python中嵌套列表的双重部分
问题描述
我如何有效地编码?
目标:[ [2,2],[3,4],[3,4] ]
第一次尝试:
[ [2,2],[[3,4]]*2 ]
--> [[2, 2], [[3, 4], [3, 4]]]
#这是一个嵌套列表
第二次尝试:
[ [2,2],[3,4]*2 ]
--> [[2, 2], [3, 4, 3, 4]]
#少了一窝
解决方案
在 Python 3.5 或更高版本中,您可以*iterable
在[...]
列表显示中使用(创建列表对象的文字语法)将可迭代扩展为新元素。因为您要添加嵌套列表对象的重复副本,所以您不想使用乘法来生成这些副本,因为乘法不会创建副本。
因此,您可以在此处使用带有循环的生成器表达式在每个迭代步骤中创建新的列表对象:
l = [[2, 2], *([3, 4] for _ in range(2))]
仅仅两个副本确实有点矫枉过正,但也许你有更复杂的数据。对于这个简单的案例,我只使用[[2, 2], [3, 4], [3, 4]]
.
您可以多次使用该语法,并混合更多列表:
l = [
[2, 2],
*([3, 4] for _ in range(2)),
*([42, 81, 117] for _ in range(7)),
[45, 44, 43],
]
使用生成器表达式可以避免创建额外的中间列表,然后再次丢弃这些中间列表。
该*iterable
语法称为可迭代解包,并且还扩展到元组和集合,您可以对**mapping
字典显示中的语法执行相同操作。
如果您使用的是较旧的 Python 版本(例如 Python 2),您确实需要升级。Python 2.7 现在只接收错误修复和安全更新,直到 2019 年底。Python 3.4 和更早版本现在完全不受支持。但是如果你被卡住了,你唯一的选择是使用多行,使用 or 扩展初始列表对象+=
,list.expand()
或者使用list.append()
添加单个元素:
l = [[2, 2]]
l += ([3, 4] for _ in range(2))
l += ([42, 81, 117] for _ in range(7))
l.append([45, 44, 43]) # or maybe use `l += [45, 44, 43],` *with* that comma at the end!