the*_*ace 243 python multidimensional-array
我正在开始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 = []
Run Code Online (Sandbox Code Playgroud)
它给出了期望的结果,但感觉就像一个解决方法.有没有更简单/更短/更优雅的方式来做到这一点?
Mik*_*ham 361
Python中经常出现的模式是
bar = []
for item in some_iterable:
bar.append(SOME EXPRESSION)
Run Code Online (Sandbox Code Playgroud)
这有助于激发列表推导的引入,将列表转换为
bar = [SOME EXPRESSION for item in some_iterable]
Run Code Online (Sandbox Code Playgroud)
这是更短,有时更清晰.通常你会养成识别这些并经常用理解来代替循环的习惯.
您的代码遵循此模式两次
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) /
Run Code Online (Sandbox Code Playgroud)
Ada*_*eld 205
您可以使用列表理解:
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)
Run Code Online (Sandbox Code Playgroud)
Joh*_*ooy 130
这种方式比嵌套列表推导更快
[x[:] for x in [[foo] * 10] * 10] # for immutable foo!
Run Code Online (Sandbox Code Playgroud)
这里有一些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
Run Code Online (Sandbox Code Playgroud)
说明:
[[foo]*10]*10
创建重复10次的同一对象的列表.你不能只使用它,因为修改一个元素将修改每一行中的相同元素!
x[:]
相当于list(X)
但更高效,因为它避免了名称查找.无论哪种方式,它都会创建每行的浅表副本,因此现在所有元素都是独立的.
所有元素都是相同的foo
对象,所以如果foo
是可变的,你就不能使用这个方案.你必须使用它
import copy
[[copy.deepcopy(foo) for x in range(10)] for y in range(10)]
Run Code Online (Sandbox Code Playgroud)
或者假设一个Foo
返回foo
s 的类(或函数)
[[Foo() for x in range(10)] for y in range(10)]
Run Code Online (Sandbox Code Playgroud)
小智 96
不要使用[[v]*n]*n,这是一个陷阱!
>>> a = [[0]*3]*3
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[0][0]=1
>>> a
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
Run Code Online (Sandbox Code Playgroud)
但是t = [[0]*3,范围(3)中的i]很好
Vip*_*pul 59
要在Python中初始化二维数组:
a = [[0 for x in range(columns)] for y in range(rows)]
Run Code Online (Sandbox Code Playgroud)
Ign*_*ams 25
[[foo for x in xrange(10)] for y in xrange(10)]
Run Code Online (Sandbox Code Playgroud)
Tus*_*har 24
对于那些困惑为什么[[\'\']*m]*n
不好用的人来说。
Python 使用名为 \xe2\x80\x9cCall by Object Reference\xe2\x80\x9d 或 \xe2\x80\x9cCall by assignment\xe2\x80\x9d 的系统。(更多信息)
\n最好的方法是[[\'\' for i in range(columns)] for j in range(rows)]
\n这将解决所有问题。
如需更多说明
\n示例:
>>> x = [[\'\']*3]*3\n[[\'\', \'\', \'\'], [\'\', \'\', \'\'], [\'\', \'\', \'\']]\n>>> x[0][0] = 1\n>>> print(x)\n[[1, \'\', \'\'], [1, \'\', \'\'], [1, \'\', \'\']]\n
Run Code Online (Sandbox Code Playgroud)\n>>> y = [[\'\' for i in range(3)] for j in range(3)]\n[[\'\', \'\', \'\'], [\'\', \'\', \'\'], [\'\', \'\', \'\']]\n>>> y[0][0]=1\n>>> print(y)\n[[1, \'\', \'\'], [\'\', \'\', \'\'], [\'\', \'\', \'\']]\n
Run Code Online (Sandbox Code Playgroud)\n
Mik*_*ham 22
通常,当您需要多维数组时,您不需要列表列表,而是需要一个numpy数组或可能是一个dict.
例如,有了numpy,你会做类似的事情
import numpy
a = numpy.empty((10, 10))
a.fill(foo)
Run Code Online (Sandbox Code Playgroud)
hit*_*wen 12
你可以这样做:
[[element] * numcols] * numrows
Run Code Online (Sandbox Code Playgroud)
例如:
>>> [['a'] *3] * 2
[['a', 'a', 'a'], ['a', 'a', 'a']]
Run Code Online (Sandbox Code Playgroud)
但这会产生不良副作用:
>>> b = [['a']*3]*3
>>> b
[['a', 'a', 'a'], ['a', 'a', 'a'], ['a', 'a', 'a']]
>>> b[1][1]
'a'
>>> b[1][1] = 'b'
>>> b
[['a', 'b', 'a'], ['a', 'b', 'a'], ['a', 'b', 'a']]
Run Code Online (Sandbox Code Playgroud)
如果它是一个人口稀少的数组,你可能最好使用一个用元组键入的字典:
dict = {}
key = (a,b)
dict[key] = value
...
Run Code Online (Sandbox Code Playgroud)
twod_list = [[foo for _ in range(m)] for _ in range(n)]
Run Code Online (Sandbox Code Playgroud)
因为n是行数,m是列数,而foo是值。
代码:
num_rows, num_cols = 4, 2
initial_val = 0
matrix = [[initial_val] * num_cols for _ in range(num_rows)]
print(matrix)
# [[0, 0], [0, 0], [0, 0], [0, 0]]
Run Code Online (Sandbox Code Playgroud)
initial_val
必须是不可变的。