我开始使用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 = []

它给出了预期的结果,但感觉像是一种变通方法。有更简单/更短/更优雅的方法吗?


当前回答

对于那些困惑为什么[["]*m]*n不好用的人。

最好的方法是[[" for i in range(columns)] for j in range(rows)] 这将解决所有问题。

如需进一步澄清 例子:

>>> x = [['']*3]*3
[['', '', ''], ['', '', ''], ['', '', '']]
>>> x[0][0] = 1
>>> print(x)
[[1, '', ''], [1, '', ''], [1, '', '']]
>>> y = [['' for i in range(3)] for j in range(3)]
[['', '', ''], ['', '', ''], ['', '', '']]
>>> y[0][0]=1
>>> print(y)
[[1, '', ''], ['', '', ''], ['', '', '']]

其他回答

row=5
col=5
[[x]*col for x in [b for b in range(row)]]

上面会给你一个5x5的2D数组

[[0, 0, 0, 0, 0],
 [1, 1, 1, 1, 1],
 [2, 2, 2, 2, 2],
 [3, 3, 3, 3, 3],
 [4, 4, 4, 4, 4]]

它使用嵌套的列表推导式。 分类如下:

[[x]*col for x in [b for b in range(row)]]

[x]*col——>被求值的最终表达式 对于——>中的x, x将是迭代器提供的值 [b for b in range(row)]]——>迭代器。

[b for b in range(row)]]这将计算为[0,1,2,3,4],因为row=5 现在化简为

[[x]*col for x in [0,1,2,3,4]]

它的值是 [[0]*5 for x in[0,1,2,3,4]]——> with x=0第一次迭代 [[1]*5 for x in[0,1,2,3,4]]——> with x=1第二次迭代 [[2]*5 for x in[0,1,2,3,4]]——> with x=2第三次迭代 [[3]*5 for x in[0,1,2,3,4]]——> with x=3第四次迭代 [[4]*5 for x in[0,1,2,3,4]]——> with x=4第五次迭代

要在Python中初始化二维列表,使用

t = [ [0]*3 for i in range(3)]

但是不要使用[[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]]

你可以使用列表推导式:

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)
twod_list = [[foo for _ in range(m)] for _ in range(n)]

n是行数,m是列数,foo是值。

我理解的重要的事情是:在初始化数组(在任何维度)时,我们应该给数组的所有位置一个默认值。然后只完成初始化。在此之后,我们可以更改或接收数组的任何位置的新值。下面的代码非常适合我

N=7
F=2

#INITIALIZATION of 7 x 2 array with deafult value as 0
ar=[[0]*F for x in range(N)]

#RECEIVING NEW VALUES TO THE INITIALIZED ARRAY
for i in range(N):
    for j in range(F):
        ar[i][j]=int(input())
print(ar)