如何在python中创建固定大小列表? 在C++中,我可以创建一个数组,比如……/p> int* a = new int[10];
在python中,我只知道我可以声明一个列表,而不是附加一些项,或者类似如何在python中创建固定大小列表? 在C++中,我可以创建一个数组,比如……/p> int* a = new int[10];,python,list,Python,List,在python中,我只知道我可以声明一个列表,而不是附加一些项,或者类似 l = [1,2,3,4] l = range(10) 我可以用给定的大小初始化列表,比如C++,不做任何赋值吗?< /p> < p>这不是真正的Python方法来初始化列表。无论如何,您可以初始化如下列表: >>> l = [None] * 4 >>> l [None, None, None, None] >>> [None]*10 [None, None, No
l = [1,2,3,4]
l = range(10)
我可以用给定的大小初始化列表,比如C++,不做任何赋值吗?< /p> < p>这不是真正的Python方法来初始化列表。无论如何,您可以初始化如下列表:
>>> l = [None] * 4
>>> l
[None, None, None, None]
>>> [None]*10
[None, None, None, None, None, None, None, None, None, None]
Python没有内置支持这一点的功能。您真的需要对它进行优化吗?因为我认为追加不会增加那么多开销 但是,您可以执行类似于
l=[None]*1000的操作
或者,您可以使用生成器。(tl;dr:您的问题的确切答案是numpy.empty
或numpy.empty\u喜欢
,但您可能不在乎,可以使用myList=[None]*10000
)
your_list = [None]*size_required
简单方法
您可以将列表初始化为所有相同的元素。从语义上讲,使用非数字值(如果使用它,以后会出现错误,这是一件好事)或类似于0的值(不寻常?如果您正在编写稀疏矩阵或“默认”值应为0且您不担心bug,则可能有用)是否有意义取决于您:
>>> [None for _ in range(10)]
[None, None, None, None, None, None, None, None, None, None]
(这里\uu
只是一个变量名,您可以使用i
)
您也可以这样做:
>>> l = [None] * 4
>>> l
[None, None, None, None]
>>> [None]*10
[None, None, None, None, None, None, None, None, None, None]
您可能不需要对此进行优化。您还可以在每次需要时附加到阵列:
>>> x = []
>>> for i in range(10):
>>> x.append(i)
简单方法的性能比较
哪一个最好
>>> def initAndWrite_test():
... x = [None]*10000
... for i in range(10000):
... x[i] = i
...
>>> def initAndWrite2_test():
... x = [None for _ in range(10000)]
... for i in range(10000):
... x[i] = i
...
>>> def appendWrite_test():
... x = []
... for i in range(10000):
... x.append(i)
python2.7中的结果:
>>> import timeit
>>> for f in [initAndWrite_test, initAndWrite2_test, appendWrite_test]:
... print('{} takes {} usec/loop'.format(f.__name__, timeit.timeit(f, number=1000)*1000))
...
initAndWrite_test takes 714.596033096 usec/loop
initAndWrite2_test takes 981.526136398 usec/loop
appendWrite_test takes 908.597946167 usec/loop
python 3.2中的结果:
initAndWrite_test takes 641.3581371307373 usec/loop
initAndWrite2_test takes 1033.6499214172363 usec/loop
appendWrite_test takes 895.9040641784668 usec/loop
正如我们所看到的,在python2和python3中使用习惯用法[None]*10000
可能更好。然而,如果一个人正在做比赋值更复杂的事情(例如生成或处理列表中的每个元素的复杂事情),那么开销就变成了成本中毫无意义的一小部分。也就是说,如果您对列表中的元素做了任何合理的事情,那么现在就担心这种优化还为时过早
未初始化内存
然而,这些都是低效的,因为它们通过内存,在这个过程中写入一些东西。在C语言中,这是不同的:未初始化的数组充满了随机垃圾内存(旁注:已从系统中重新分配,当您分配或无法锁定内存和/或在关闭程序时无法删除内存时,这可能是一个错误)。这是一个设计选择,旨在加速:C语言的制造商认为最好不要自动初始化内存,这是正确的选择
这不是一个渐进加速(因为它是O(N)
),但例如,在覆盖您真正关心的内容之前,您不需要首先初始化整个内存块。如果可能的话,这相当于(伪代码)x=list(size=10000)
如果您想要python中类似的东西,可以使用numpy
numerical matrix/N-dimensional-array操纵包。具体地说,或者
这就是你问题的真正答案。你可以用这个:[None]*10
。但这将不是“固定大小”,您仍然可以附加、删除。。。这就是制作列表的方式
您可以将其设置为一个元组(tuple([None]*10)
),以固定其宽度,但同样,您无法更改它(并非在所有情况下,仅当存储的项是可变的时)
另一个更接近您需求的选项不是列表,而是具有最大长度的collections.deque
。这是最大尺寸,但也可以小一些
import collections
max_4_items = collections.deque([None] * 4, maxlen=4)
但是,只需使用一个列表,习惯于“python”的做事方式。
注意,当你在C++中使用数组时,你可能有不同的需求,在Python中用不同的方式解决:
您可能只需要一组项目;Python列表完美地处理了这个用例
您可能需要一个适当的同质项数组。Python列表不是存储数组的好方法
Python通过解决了对数组的需求,除其他巧妙方法外,它还提供了一种创建已知大小数组的方法:
from numpy import *
l = zeros(10)
其中n是数组的大小
虽然它可以工作,但这可能不是最好的主意,因为您必须为此导入库。希望这有帮助 您可以使用模块来完成。数组模块是python标准库的一部分:
from array import array
from itertools import repeat
a = array("i", repeat(0, 10))
# or
a = array("i", [0]*10)
函数将0值重复10次。它比[0]*10更节省内存,因为它不分配内存,但会重复返回相同的数字x次。这与其说是一个答案,不如说是一个警告。
在看到其他答案后,我受到了诱惑,设置了一个这样的数组speakers=['',][']*10
,我非常后悔,因为由此产生的list
没有像我想的那样运行。
我求助于:
speakers = []
for i in range(10):
speakers.append(['',''])
如['',]]*10
所示,将创建一个列表
,其中后续元素是第一个元素的副本。
例如:
>>> n=[['','']]*10
>>> n
[['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', '']]
>>> n[0][0] = "abc"
>>> n
[['abc', ''], ['abc', ''], ['abc', ''], ['abc', ''], ['abc', ''], ['abc', ''], ['abc', ''], ['abc', ''], ['abc', ''], ['abc', '']]
>>> n[0][1] = "True"
>>> n
[['abc', 'True'], ['abc', 'True'], ['abc', 'True'], ['abc', 'True'], ['abc', 'True'], ['abc', 'True'], ['abc', 'True'], ['abc', 'True'], ['abc', 'True'], ['abc', 'True']]
而使用.append
选项:
>>> n=[]
>>> for i in range(10):
... n.append(['',''])
...
>>> n
[['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', '']]
>>> n[0][0] = "abc"
>>> n
[['abc', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', '']]
>>> n[0][1] = "True"
>>> n
[['abc', 'True'], ['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', '']]
我确信ninjagecko接受的答案确实试图提及这一点,遗憾的是,我太糊涂了,无法理解。
收工,保重 您不需要在Python中声明列表。只要在你想使用它的时候初始化它就行了。对,你到底为什么需要它呢?@WeaselFox:有时候需要;例如,假设你想做筛子或Eratoshenes。注意,range(10)
实际上是python3中的生成器对象;你将无法使它变异。您将需要执行list(范围(10))
实际上,如果您知道列表的长度,那么首先创建长度为n的“空列表”,然后通过索引分配值要比附加每个附加项快。好的,我不太熟悉python的内存管理,我会改变主意。谢谢~Usin