如何在 Python 中初始化二维数组(如果不使用 NumPy,则为列表列表)?

2024-12-06 08:40:00
admin
原创
97
摘要:问题描述:我刚开始学习 Python,想使用一个二维列表,最初在每个地方都用相同的变量填充。我想到了这个:def initialize_twodlist(foo): twod_list = [] new = [] for i in range (0, 10): for ...

问题描述:

我刚开始学习 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或者假设一个返回foos的类(或函数)

[[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=列

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   997  
  在项目管理领域,CDCP(Certified Data Center Professional)认证评审是一个至关重要的环节,它不仅验证了项目团队的专业能力,还直接关系到项目的成功与否。在这一评审过程中,沟通技巧的运用至关重要。有效的沟通不仅能够确保信息的准确传递,还能增强团队协作,提升评审效率。本文将深入探讨CDCP...
华为IPD流程   34  
  IPD(Integrated Product Development,集成产品开发)是一种以客户需求为核心、跨部门协同的产品开发模式,旨在通过高效的资源整合和流程优化,提升产品开发的成功率和市场竞争力。在IPD培训课程中,掌握关键成功因素是确保团队能够有效实施这一模式的核心。以下将从五个关键成功因素展开讨论,帮助企业和...
IPD项目流程图   40  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司在其全球化进程中逐步构建和完善的一套高效产品开发管理体系。这一流程不仅帮助华为在技术创新和产品交付上实现了质的飞跃,还为其在全球市场中赢得了显著的竞争优势。IPD的核心在于通过跨部门协作、阶段性评审和市场需求驱动,确保...
华为IPD   39  
  华为作为全球领先的通信技术解决方案提供商,其成功的背后离不开一套成熟的管理体系——集成产品开发(IPD)。IPD不仅是一种产品开发流程,更是一种系统化的管理思想,它通过跨职能团队的协作、阶段评审机制和市场需求驱动的开发模式,帮助华为在全球市场中脱颖而出。从最初的国内市场到如今的全球化布局,华为的IPD体系在多个领域展现...
IPD管理流程   71  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用