Python:创建n个列表列表的最快方法

mun*_*nch 89 python

所以我想知道如何最好地创建一个空白列表列表:

[[],[],[]...]
Run Code Online (Sandbox Code Playgroud)

由于Python如何使用内存中的列表,这不起作用:

[[]]*n
Run Code Online (Sandbox Code Playgroud)

这确实创建[[],[],...]但每个元素都是相同的列表:

d = [[]]*n
d[0].append(1)
#[[1],[1],...]
Run Code Online (Sandbox Code Playgroud)

像列表理解这样的东西:

d = [[] for x in xrange(0,n)]
Run Code Online (Sandbox Code Playgroud)

但是这使用Python VM进行循环.有没有办法使用隐含循环(利用它用C语言编写)?

d = []
map(lambda n: d.append([]),xrange(0,10))
Run Code Online (Sandbox Code Playgroud)

这实际上比较慢.:(

Sve*_*ach 96

可能唯一的方法是略快于

d = [[] for x in xrange(n)]
Run Code Online (Sandbox Code Playgroud)

from itertools import repeat
d = [[] for i in repeat(None, n)]
Run Code Online (Sandbox Code Playgroud)

它不必int在每次迭代中创建一个新对象,并且在我的机器上快5%.

编辑:使用NumPy,您可以避免使用Python循环

d = numpy.empty((n, 0)).tolist()
Run Code Online (Sandbox Code Playgroud)

但这实际上比列表理解慢2.5倍.

  • @Paul:由于lambda表达式的函数调用开销,这将再次变慢. (3认同)

小智 12

列表推导实际上比显式循环更有效地实现(参见示例函数dis输出),并且map必须在每次迭代时调用ophaque可调用对象,这会产生相当大的开销.

无论如何,这[[] for _dummy in xrange(n)]是正确的方法,并且在各种其他方式之间的任何微小(如果存在的话)速度差异都不重要.当然,除非您花费大部分时间来做这件事 - 但在这种情况下,您应该使用算法.你多久创建一次这些列表?

  • 不使用它的最重要原因是它往往会让人感到困惑,使他们认为它是某种特殊的语法.除了交互式解释器中与`_`的冲突外,它还与常见的gettext别名冲突.如果你想弄清楚变量是一个虚拟变量,可以称之为`dummy`,而不是`_`. (12认同)
  • @Sven:为什么不呢?它通常用于未使用的变量(如果它被称为`i`,我将寻找它的使用位置).唯一的缺陷是它会在REPL中隐藏最后一个结果的`_` ......而这只是2.x中列表推导泄漏的情况. (11认同)
  • 请不要把`_`作为变量名!否则很好的答案:) (5认同)

ekt*_*kta 10

这里有两个方法,一个是甜的和简单的(和概念的),另一个是更正式的,可以在阅读数据集之后在各种情况下进行扩展.

方法1:概念性

X2=[]
X1=[1,2,3]
X2.append(X1)
X3=[4,5,6]
X2.append(X3)
X2 thus has [[1,2,3],[4,5,6]] ie a list of lists. 
Run Code Online (Sandbox Code Playgroud)

方法2:正式和可扩展

另一种将列表存储为不同数字列表列表的优雅方式 - 它从文件中读取.(此处的文件包含数据集列表)Train是一个数据集,例如50行和20列.即.Train [0]给我第一行的csv文件,train [1]给我第二行,依此类推.我有兴趣将数据集与50行作为一个列表分开,除了列0,这是我在这里解释的变量,因此必须从orignal train数据集中删除,然后在列表后按比例放大列表 - 即列表列表.这是执行此操作的代码.

请注意,我在内循环中从"1"读取,因为我只对解释变量感兴趣.我在另一个循环中重新初始化X1 = [],否则X2.append([0:(len(train [0]) - 1)])将一遍又一遍地重写X1 - 除了它更有效的内存.

X2=[]
for j in range(0,len(train)):
    X1=[]
    for k in range(1,len(train[0])):
        txt2=train[j][k]
        X1.append(txt2)
    X2.append(X1[0:(len(train[0])-1)])
Run Code Online (Sandbox Code Playgroud)


小智 7

要创建列表和列表列表,请使用以下语法

     x = [[] for i in range(10)]
Run Code Online (Sandbox Code Playgroud)

这将创建一维列表并初始化它,将数字放入 [[number] 中,并设置列表的长度,将长度放入范围(长度)中

  • 要创建列表列表,请使用以下语法。
    x = [[[0] for i in range(3)] for i in range(10)]
Run Code Online (Sandbox Code Playgroud)

这将初始化具有 10*3 维度且值为 0 的列表列表

  • 访问/操作元素
    x[1][5]=value
Run Code Online (Sandbox Code Playgroud)