所以我想知道如何最好地创建一个空白列表列表:
[[],[],[]...]
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倍.
小智 12
列表推导实际上比显式循环更有效地实现(参见示例函数的dis输出),并且map必须在每次迭代时调用ophaque可调用对象,这会产生相当大的开销.
无论如何,这[[] for _dummy in xrange(n)]是正确的方法,并且在各种其他方式之间的任何微小(如果存在的话)速度差异都不重要.当然,除非您花费大部分时间来做这件事 - 但在这种情况下,您应该使用算法.你多久创建一次这些列表?
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)