如何有效地对此进行编码?
目标:[ [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]]
#缺少一个巢
答案 0 :(得分:1)
在Python 3.5或更高版本中,可以在*iterable
列表显示(用于创建列表对象的文字语法)内使用[...]
,以将迭代器扩展为新元素。因为要添加嵌套列表对象的重复副本,所以不不想使用乘法来生成这些副本,因为multiplication doesn't create copies。
因此,您可以在此处使用带有循环的生成器表达式,以在每个迭代步骤中创建新的列表对象:
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
语法被称为iterable unpacking,并且扩展到元组和集合,并且您可以在字典显示中使用**mapping
语法进行同样的操作。
如果您使用的是较旧的Python版本(例如Python 2),则确实要升级。 Python 2.7现在仅接受错误修复和安全更新,并且直到2019年年底。现在完全不支持Python 3.4和更早版本。但是,如果遇到问题,唯一的选择是使用多行,用+=
或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!
答案 1 :(得分:0)
使用列表理解和*
进行拆包:
a = [ [2,2],*[[3,4] for _ in range(2)]]
#[[2, 2], [3, 4], [3, 4]]
证明有效:
print(list(map(id, a)))
# [4859792328, 4859369864, 4859792008]