多维list初始化的方便写法

2013-06-01 03:04:27 +08:00
 charnugagoo
python中多维list初始化时如果这样写
d = [[None]*2]*3时是浅层拷贝,修改内容时会有牵连。。
这样写安全
d = [[None for x in xrange(2)] for x in xrange(3)]
但是又很麻烦。
在初始化一个list时,比如一个5维的,如果我想避免浅层拷贝,什么样的写法最好呢?
4925 次点击
所在节点    Python
5 条回复
hhrmatata
2013-06-01 09:02:08 +08:00
以下来自Python Cookbook:

更简便的写法是:
d = [[None] * 2 for x in range(3)]
但是遵照Python的哲学,更推荐更规范和更具有可读性的写法:
d = [[None for x in xrange(2)] for x in xrange(3)]
charnugagoo
2013-06-01 10:21:31 +08:00
@hhrmatata
我现在需要初始化一个五维list ToT,这两种写法都很丑陋啊。。
sillyousu
2013-06-01 10:40:38 +08:00
def gen_list(dem, rang):
----if dem == 1:
--------return [None for x in range(rang)]
----else:
--------return [gen_list(dem-1, rang) for x in range(rang)]
这样?

五维,感觉不管怎么搞都是不好搞。 想到了 list[0][1][2][3][4] 和很多层的循环嵌套。
hhrmatata
2013-06-01 11:17:49 +08:00
构造递归函数,得到任何维度的初始化:

def make(dims, n, init_value):
if n == 1:
return [init_value for i in range(dims[n - 1])]
else:
return [make(dims, n - 1, init_value) for i in range(dims[n - 1])]

>>> dims1 = [2, 3]
>>> print make(dims1, 2, None)
[[None, None], [None, None], [None, None]]

>>> dims2 = [1, 2, 3, 4, 5]
>>> print make(dims2, 5, 0)
[[[[[0], [0]], [[0], [0]], [[0], [0]]], [[[0], [0]], [[0], [0]], [[0], [0]]], [[[0], [0]], [[0], [0]], [[0], [0]]], [[[0], [0]], [[0], [0]], [[0], [0]]]], [[[[0], [0]], [[0], [0]], [[0], [0]]], [[[0], [0]], [[0], [0]], [[0], [0]]], [[[0], [0]], [[0], [0]], [[0], [0]]], [[[0], [0]], [[0], [0]], [[0], [0]]]], [[[[0], [0]], [[0], [0]], [[0], [0]]], [[[0], [0]], [[0], [0]], [[0], [0]]], [[[0], [0]], [[0], [0]], [[0], [0]]], [[[0], [0]], [[0], [0]], [[0], [0]]]], [[[[0], [0]], [[0], [0]], [[0], [0]]], [[[0], [0]], [[0], [0]], [[0], [0]]], [[[0], [0]], [[0], [0]], [[0], [0]]], [[[0], [0]], [[0], [0]], [[0], [0]]]], [[[[0], [0]], [[0], [0]], [[0], [0]]], [[[0], [0]], [[0], [0]], [[0], [0]]], [[[0], [0]], [[0], [0]], [[0], [0]]], [[[0], [0]], [[0], [0]], [[0], [0]]]]]
hhrmatata
2013-06-01 11:20:16 +08:00
好吧,代码不能缩进;回复后又不能修改

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/70835

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX