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)]