如何在 Python 中初始化二维数组(如果不使用 NumPy,则为列表列表)?
- 2024-12-06 08:40:00
- admin 原创
- 98
问题描述:
我刚开始学习 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 = []
它给出了所需的结果,但感觉像是一种解决方法。有没有更简单/更短/更优雅的方法来做到这一点?
解决方案 1:
要在 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]]
解决方案 2:
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): \n new = [] can be replaced } this too
for j in range (0, 10): } with a list /
new.append(foo) / comprehension /
twod_list.append(new) /
解决方案 3:
您可以使用列表推导:
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)
解决方案 4:
这种方式比嵌套列表推导更快
[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
或者假设一个返回foo
s的类(或函数)
[[Foo() for x in range(10)] for y in range(10)]
解决方案 5:
在 Python 中初始化二维数组:
a = [[0 for x in range(columns)] for y in range(rows)]
解决方案 6:
[[foo for x in xrange(10)] for y in xrange(10)]
解决方案 7:
通常,当您想要多维数组时,您不需要列表列表,而是需要 numpy 数组或可能是字典。
例如,使用 numpy 你可以执行以下操作
import numpy
a = numpy.empty((10, 10))
a.fill(foo)
解决方案 8:
对于那些感到困惑为什么[['']*m]*n
不宜用的人来说。
Python 使用称为“通过对象引用调用”或“通过赋值调用”的系统。(更多信息)
最好的方法是[['' 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, '', ''], ['', '', ''], ['', '', '']]
解决方案 9:
你可以这样做:
[[element] * numcols] * numrows
例如:
>>> [['a'] *3] * 2
[['a', 'a', 'a'], ['a', 'a', 'a']]
但这有一个不良的副作用:
>>> 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']]
解决方案 10:
twod_list = [[foo for _ in range(m)] for _ in range(n)]
其中 n 是行数,m 是列数,foo 是值。
解决方案 11:
如果它是一个稀疏数组,那么最好使用以元组为键的字典:
dict = {}
key = (a,b)
dict[key] = value
...
解决方案 12:
代码:
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]]
initial_val
必须是不可变的。
解决方案 13:
t = [ [0]*10 for i in [0]*10]
对于每个元素[0]*10
都会创建一个新的..
解决方案 14:
错误方法:[[无m]n]
>>> m, n = map(int, raw_input().split())
5 5
>>> x[0][0] = 34
>>> x
[[34, None, None, None, None], [34, None, None, None, None], [34, None, None, None, None], [34, None, None, None, None], [34, None, None, None, None]]
>>> id(x[0][0])
140416461589776
>>> id(x[3][0])
140416461589776
使用这种方法,python 不允许为外部列创建不同的地址空间,并且会导致各种超出您预期的不当行为。
方法正确,但有例外:
y = [[0 for i in range(m)] for j in range(n)]
>>> id(y[0][0]) == id(y[1][0])
False
这是个好方法,但如果你将默认值设置为None
>>> r = [[None for i in range(5)] for j in range(5)]
>>> r
[[None, None, None, None, None], [None, None, None, None, None], [None, None, None, None, None], [None, None, None, None, None], [None, None, None, None, None]]
>>> id(r[0][0]) == id(r[2][0])
True
因此,请使用此方法正确设置您的默认值。
绝对正确:
按照麦克的双循环回复。
解决方案 15:
要初始化二维数组,使用:arr = [[]*m for i in range(n)]
实际上,arr = [[]*m]*n
将创建一个二维数组,其中所有 n 个数组都指向同一个数组,因此任何元素值的任何变化都将反映在所有 n 个列表中
有关更多解释请访问: https: //www.geeksforgeeks.org/python-using-2d-arrays-lists-the-right-way/
解决方案 16:
用最简单的想法来创造这个。
wtod_list = []
并添加尺寸:
wtod_list = [[0 for x in xrange(10)] for x in xrange(10)]
或者如果我们想首先声明尺寸。我们只使用:
wtod_list = [[0 for x in xrange(10)] for x in xrange(10)]
解决方案 17:
使用 0 初始化大小为 m X n 的二维矩阵
m,n = map(int,input().split())
l = [[0 for i in range(m)] for j in range(n)]
print(l)
解决方案 18:
我以这种方式使用它来创建MxN
矩阵,其中m = number(rows)
和n = number(columns)
。
arr = [[None]*(n) for _ in range(m)]
解决方案 19:
Matrix={}
for i in range(0,3):
for j in range(0,3):
Matrix[i,j] = raw_input("Enter the matrix:")
解决方案 20:
如果你使用numpy,你可以轻松创建二维数组:
import numpy as np
row = 3
col = 5
num = 10
x = np.full((row, col), num)
十
array([[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10]])
解决方案 21:
row=5
col=5
[[x]*col for x in [b for b in range(row)]]
以上将给你一个 5x5 的二维数组
[[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 in 进行求值的最终表达式--> x 将是迭代器
[b for b in range(row)]] --> 迭代器
提供的值。
[b for b in range(row)]] 由于 row=5,因此计算结果为 [0,1,2,3,4]
,因此现在简化为
[[x]*col for x in [0,1,2,3,4]]
这将评估为 [[0]*5 for x in [0,1,2,3,4]] --> x=0 第 1 次迭代
[[1]*5 for x in [0,1,2,3,4]] --> x=1 第 2 次迭代
[[2]*5 for x in [0,1,2,3,4]] --> x=2 第 3 次迭代
[[3]*5 for x in [0,1,2,3,4]] --> x=3 第 4 次迭代
[[4]*5 for x in [0,1,2,3,4]] --> x=4 第 5 次迭代
解决方案 22:
正如 @Arnab 和 @Mike 指出的那样,数组不是列表。两者的区别在于:1) 数组在初始化时大小固定;2) 数组通常支持的操作比列表少。
在大多数情况下可能有点过度,但这是一个利用 python ctypes(c 库)硬件数组实现的基本二维数组实现
import ctypes
class Array:
def __init__(self,size,foo): #foo is the initial value
self._size = size
ArrayType = ctypes.py_object * size
self._array = ArrayType()
for i in range(size):
self._array[i] = foo
def __getitem__(self,index):
return self._array[index]
def __setitem__(self,index,value):
self._array[index] = value
def __len__(self):
return self._size
class TwoDArray:
def __init__(self,columns,rows,foo):
self._2dArray = Array(rows,foo)
for i in range(rows):
self._2dArray[i] = Array(columns,foo)
def numRows(self):
return len(self._2dArray)
def numCols(self):
return len((self._2dArray)[0])
def __getitem__(self,indexTuple):
row = indexTuple[0]
col = indexTuple[1]
assert row >= 0 and row < self.numRows() \n and col >=0 and col < self.numCols(),\n "Array script out of range"
return ((self._2dArray)[row])[col]
if(__name__ == "__main__"):
twodArray = TwoDArray(4,5,5)#sample input
print(twodArray[2,3])
解决方案 23:
这是一个更简单的方法:
import numpy as np
twoD = np.array([[]*m]*n)
要使用任何“x”值初始化所有单元格,请使用:
twoD = np.array([[x]*m]*n
解决方案 24:
空的二维矩阵可以按照以下方式初始化:
温度=[[],[]]
解决方案 25:
这是我发现的最好的教学新程序员的方法,而且不需要使用额外的库。不过我想要更好的。
def initialize_twodlist(value):
list=[]
for row in range(10):
list.append([value]*10)
return list
解决方案 26:
我经常使用这种方法来初始化二维数组
n=[[int(x) for x in input().split()] for i in range(int(input())]
解决方案 27:
从这一系列中可以得出添加维度的一般模式:
x = 0
mat1 = []
for i in range(3):
mat1.append(x)
x+=1
print(mat1)
x=0
mat2 = []
for i in range(3):
tmp = []
for j in range(4):
tmp.append(x)
x+=1
mat2.append(tmp)
print(mat2)
x=0
mat3 = []
for i in range(3):
tmp = []
for j in range(4):
tmp2 = []
for k in range(5):
tmp2.append(x)
x+=1
tmp.append(tmp2)
mat3.append(tmp)
print(mat3)
解决方案 28:
我理解的重要一点是:初始化数组(任意维度)时,我们应该为数组的所有位置赋予默认值。这样初始化才完成。之后,我们可以更改或接收数组任意位置的新值。下面的代码对我来说非常完美
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)
解决方案 29:
另一种方法是使用字典来保存二维数组。
twoD = {}
twoD[0,0] = 0
print(twoD[0,0]) # ===> prints 0
这只能保存任何 1D、2D 值,并且要将其初始化为0
或任何其他 int 值,请使用集合。
import collections
twoD = collections.defaultdict(int)
print(twoD[0,0]) # ==> prints 0
twoD[1,1] = 1
print(twoD[1,1]) # ==> prints 1
解决方案 30:
lst=[[0]*n]*m
np.array(lst)
初始化所有矩阵 m=行 和 n=列
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件