Memory management 如何在Python中创建空列表的列表或元组?
我需要递增地填充一个列表或列表的元组。看起来像这样的东西:Memory management 如何在Python中创建空列表的列表或元组?,memory-management,python,Memory Management,Python,我需要递增地填充一个列表或列表的元组。看起来像这样的东西: result = [] firstTime = True for i in range(x): for j in someListOfElements: if firstTime: result.append([f(j)]) else: result[i].append(j) 为了让它更简洁、更优雅,我想我会预先分配一个空列表 result = c
result = []
firstTime = True
for i in range(x):
for j in someListOfElements:
if firstTime:
result.append([f(j)])
else:
result[i].append(j)
为了让它更简洁、更优雅,我想我会预先分配一个空列表
result = createListOfEmptyLists(x)
for i in range(x):
for j in someListOfElements:
result[i].append(j)
预分配部分对我来说并不明显。当我执行result=[[]]*x
操作时,我会收到一个对同一列表的x
引用列表,以便
result[0].append(10)
print result
是:
我可以使用循环(result=[[]表示范围(x)内的I)
),但我想知道是否存在“无循环”解决方案
这是获得我想要的东西的唯一方法,为什么不通过在适当的循环中添加列表来保持简单呢
result = []
for i in range(x):
result.append([])
for j in someListOfElements:
result[i].append(j)
[编辑:添加示例]
>>> someListOfElements = ['a', 'b', 'c']
>>> x = 3
>>> result = []
>>> for i in range(x):
... result.append([])
... for j in someListOfElements:
... result[i].append(j)
...
>>>
>>> result
[['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]
请包含可运行的示例代码,这样我们就可以自己运行代码,快速了解您想要做什么。看起来你只是想要这个:
result = []
for i in range(x):
data = []
for j in someListOfElements:
data.append(j)
# or data = [j for j in someListOfElements]
result.append(data)
没有某种循环,真的没有办法创建这样的列表。但是,隐藏循环有多种方法,就像
[[]]*x
隐藏循环一样。还有列表理解,它在表达式中“隐藏”循环(谢天谢地,它仍然很明显。)还有map(list,[[]]]*x)
,它有两个隐藏循环(一个在[[[]*x
中,另一个在map
中,使用list()
创建每个列表的副本)
也有可能事先不创建列表列表。其他答案已经涵盖了简单的方法,但如果这不符合你的需要,还有其他方法。例如,您可以创建一个函数,根据需要将空列表附加到结果
列表中,并调用该函数:
def append(L, idx, item):
while len(L) <= idx:
L.append([])
L[idx].append(item)
for i in range(x):
for j in someListOfElements:
append(result, i, j)
这样做的好处是使用一个已经存在的类型,这会减少工作量,但这确实意味着您现在有了一个dict(由整数索引)而不是一个列表,它可能是您想要的,也可能不是您想要的。或者,您可以创建一个行为类似于列表的类,但将新列表附加到其自身,而不是引发IndexError,例如:
import UserList
class defaultlist(UserList.UserList):
def __getitem__(self, idx):
while len(self) <= idx:
self.append([])
return UserList.UserList.__getitem__(self, idx)
result = defaultlist()
for i in range(x):
for j in someListOfElements:
result[i].append(j)
导入用户列表
类defaultlist(UserList.UserList):
def uu getitem uu(self,idx):
而len(self)则可以编写一个快速生成器函数。除了这个特殊情况之外,它还有其他用途,所以我将对它进行一点概括。挖掘这个:
def create(n, constructor=list):
for _ in xrange(n):
yield constructor()
然后列出一个列表
result = list(create(10))
要列出空的dict
result = list(create(20, dict))
(为了完整起见)列出一张空食物清单
result = list(create(30, Foo))
当然,您也可以将上面的任何一个创建一个元组。扩展它以允许构造函数使用参数也不会太难。我可能会让它接受一个函数,该函数接受一个索引并返回要传递给构造函数的参数
最后一个想法是,因为我们对构造函数的唯一要求是它是可调用的,所以您甚至可以传递任何返回列表中所需内容的内容。例如,从数据库查询中提取结果的绑定方法。这是非常有用的三行代码
result = [list(someListOfElements) for _ in xrange(x)]
这将生成x个不同的列表,每个列表都有一个SomeListoFements
list的副本(该列表中的每个项目都是引用的,但其中的列表是副本)
如果有意义的话,考虑使用<代码>拷贝。
生成器、列表理解和其他东西都被认为是非常类似python的。可能有更好的方法来完成这一切,但仅凭这段代码很难判断。我可以问一下,列表理解有什么问题吗?我不认为列表乘法更优雅或(更)快(尽管它可以更快,因为在乘法列表时没有实例化)。对于空列表列表,有[[[]表示范围内的c(cols)]和范围内的r(行)]
list([])
有点多余。+1:列表理解不是唯一的解决方案,只是最具python风格的,我敢说是最正确的解决方案。要用n
空列表填充列表,请执行result=[[[]for uuu in xrange(n)]
对于python3,result=[somelistofements for u in range(所需长度)]
有效。@stephenb这是有效的python,但它不会做同样的事情。它创建一个列表,其中每个元素都指向SomeListoElement,而不是它们的副本。对于上面@gsamaras给出的解决方案,如果在Python 3中使用:result=[[]For uuu in range(n)]
,因为xrange
已经被弃用并且不起作用。请注意[[]*计数
不会创建空列表列表。它创建一个引用列表,引用同一个空列表。将条目添加到其中一个列表中,会将其添加到所有列表中。
result = list(create(30, Foo))
result = [list(someListOfElements) for _ in xrange(x)]