如何在Python中初始化二维数组?

2024-04-24 18:51:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我开始使用python,并尝试使用一个二维列表,最初在每个地方用相同的变量填充。我想到了这个:

def initialize_twodlist(foo):
    twod_list = []
    new = []
    for i in range (0, 10):
        for j in range (0, 10):
            new.append(foo)
        twod_list.append(new)
        new = []

它给出了期望的结果,但感觉像是一种变通方法。有没有一种更简单/更短/更优雅的方法来做到这一点?


Tags: in列表newforfoodef地方range
3条回答

这种方法比嵌套列表理解快

[x[:] for x in [[foo] * 10] * 10]    # for immutable foo!

下面是一些python3计时,小列表和大列表

$python3 -m timeit '[x[:] for x in [[1] * 10] * 10]'
1000000 loops, best of 3: 1.55 usec per loop

$ python3 -m timeit '[[1 for i in range(10)] for j in range(10)]'
100000 loops, best of 3: 6.44 usec per loop

$ python3 -m timeit '[x[:] for x in [[1] * 1000] * 1000]'
100 loops, best of 3: 5.5 msec per loop

$ python3 -m timeit '[[1 for i in range(1000)] for j in range(1000)]'
10 loops, best of 3: 27 msec per loop

说明:

[[foo]*10]*10创建重复10次的同一对象的列表。不能只使用这个,因为修改一个元素将修改每行中的同一个元素!

x[:]相当于list(X),但是效率更高一些,因为它避免了名称查找。不管怎样,它都会为每一行创建一个浅层副本,因此现在所有元素都是独立的。

不过,所有元素都是相同的foo对象,因此如果foo是可变的,则不能使用此方案,必须使用

import copy
[[copy.deepcopy(foo) for x in range(10)] for y in range(10)]

或者假设一个类(或函数)Foo返回foos

[[Foo() for x in range(10)] for y in range(10)]

您可以使用list comprehension

x = [[foo for i in range(10)] for j in range(10)]
# x is now a 10x10 array of 'foo' (which can depend on i and j if you want)

Python中经常出现的一个模式是

bar = []
for item in some_iterable:
    bar.append(SOME EXPRESSION)

这有助于推动列表理解的引入,将该片段转换为

bar = [SOME EXPRESSION for item in some_iterable]

它更短,有时更清晰。通常你习惯于识别这些,并且经常用理解来代替循环。

您的代码遵循此模式两次

twod_list = []                                       \                      
for i in range (0, 10):                               \
    new = []                  \ can be replaced        } this too
    for j in range (0, 10):    } with a list          /
        new.append(foo)       / comprehension        /
    twod_list.append(new)                           /

相关问题 更多 >