如何在Python中创建空列表的列表或元组?

2024-10-01 07:29:20 发布

您现在位置: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 = createListOfEmptyLists(x)
for i in range(x):
    for j in someListOfElements:
        result[i].append(j)

预分配部分对我来说并不明显。当我执行result = [[]] * x操作时,我会收到一个列表,其中包含对同一个列表的x引用,因此

result[0].append(10)
print result

是:

[[10], [10], [10], [10], [10], [10], [10], [10], [10], [10]]

我可以使用循环(result = [[] for i in range(x)]),但我想知道是否存在“无循环”解决方案。

只有这样才能得到我想要的


Tags: intrue列表forif方式rangeresult
3条回答

你可以编写一个快速的生成器函数。除了这个特殊的例子之外,这还有其他用途,所以我将对它进行一点概括。挖这个:

def create(n, constructor=list):
    for _ in xrange(n):
        yield constructor()

然后列一张单子

result = list(create(10))

列出一个空的口述

result = list(create(20, dict))

(为了完整起见)列出一个空的foo列表

result = list(create(30, Foo))

当然,你也可以做一个以上任何一个元组。扩展它以允许参数到构造函数也不难。我可能会让它接受一个接受索引并返回要传递给构造函数的参数的函数。

最后一个想法是,因为我们对constructor的唯一要求是它是可调用的,所以您甚至可以传递任何返回列表中所需内容的内容。例如,从数据库查询中提取结果的绑定方法。这是非常有用的三行代码。

result = [list(someListOfElements) for _ in xrange(x)]

这将生成x个不同的列表,每个列表都有一个someListOfElements列表的副本(该列表中的每个项都是通过引用的,但其中的列表是一个副本)。

如果更有意义,可以考虑使用copy.deepcopy(someListOfElements)

生成器和列表理解和事物被认为是非常Python

如果没有some排序的循环,就没有办法创建这样的列表。不过,隐藏循环有多种方法,就像[[]] * x隐藏循环一样。还有列表理解,它“隐藏”了表达式中的循环(幸运的是它仍然很明显),还有map(list, [[]]*x)它有两个隐藏的循环(一个在[[]] * x中,另一个在map中,使用list()创建每个列表的副本)

也有可能事先不创建列表列表。其他的答案已经涵盖了简单的方法,但是如果这不符合你的需要,还有其他的方法。例如,可以根据需要创建一个函数,将空列表追加到result列表中,并调用该函数:

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)

或者可以使用collections.defaultdict(list)而不是列表:

import collections
result = collections.defaultdict(list)
for i in range(x):
    for j in someListOfElements:
        result[i].append(j)

这样做的好处是使用一个已经存在的类型,这是一个较少的工作,但它确实意味着您现在有一个dict(由整数索引)而不是一个列表,这可能是您想要的,也可能不是您想要的。或者您可以创建一个行为类似于列表但将新列表附加到自身而不是引发索引器错误的类,例如:

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)

相关问题 更多 >