V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
charnugagoo
V2EX  ›  Python

多维list初始化的方便写法

  •  
  •   charnugagoo ·
    charnugagoo · 2013-06-01 03:04:27 +08:00 · 5083 次点击
    这是一个创建于 4180 天前的主题,其中的信息可能已经有所发展或是发生改变。
    python中多维list初始化时如果这样写
    d = [[None]*2]*3时是浅层拷贝,修改内容时会有牵连。。
    这样写安全
    d = [[None for x in xrange(2)] for x in xrange(3)]
    但是又很麻烦。
    在初始化一个list时,比如一个5维的,如果我想避免浅层拷贝,什么样的写法最好呢?
    5 条回复    1970-01-01 08:00:00 +08:00
    hhrmatata
        1
    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
        2
    charnugagoo  
    OP
       2013-06-01 10:21:31 +08:00
    @hhrmatata
    我现在需要初始化一个五维list ToT,这两种写法都很丑陋啊。。
    sillyousu
        3
    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
        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
        5
    hhrmatata  
       2013-06-01 11:20:16 +08:00
    好吧,代码不能缩进;回复后又不能修改
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2756 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:58 · PVG 15:58 · LAX 23:58 · JFK 02:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.