python中嵌套列表的双部分

时间:2018-10-24 11:18:11

标签: 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]]#缺少一个巢

2 个答案:

答案 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]