Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中创建固定大小列表? 在C++中,我可以创建一个数组,比如……/p> int* a = new int[10];_Python_List - Fatal编程技术网

如何在python中创建固定大小列表? 在C++中,我可以创建一个数组,比如……/p> int* a = new int[10];

如何在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

在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, 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