簡體   English   中英

如何在Python中創建空列表的列表或元組?

[英]How to create a list or tuple of empty lists in 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)] ),但我想知道是否存在“無循環”解決方案。

是獲得我正在尋找的唯一方法

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

這將生成x個不同的列表,每個列表都有someListOfElements列表的副本( someListOfElements列表中的每個項目都是引用,但其中的列表是副本)。

如果它更有意義,請考慮使用copy.deepcopy(someListOfElements)

生成器和列表推導和事物被認為是非常pythonic

有沒有真正的方式沒有某種形式的循環來創建這樣一個列表。 但是,有多種隱藏循環的方法,就像[[]] * x隱藏循環一樣。 有一個列表理解,它將表達式“隱藏”在一個表達式中(幸運的是它仍然顯而易見。)還有map(list, [[]]*x) ,它有兩個隱藏的循環( [[]] * xmap中的一個使用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(用整數索引)而不是列表,這可能是也可能不是你想要的。 或者你可以創建一個類似於列表的類,但是將新列表附加到自身而不是引發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)

你可以寫一個快速生成器函數。 除了這個特殊情況之外,這將有其他用途,所以我會稍微概括一下。 挖這個:

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

然后列出一個列表,

result = list(create(10))

列出空的dicts,

result = list(create(20, dict))

並且(為了完整起見)列出空的Foos,

result = list(create(30, Foo))

當然,你也可以制作上述任何一個元組。 擴展它以允許構造函數的參數也不會太難。 我可能會接受一個接受索引的函數並返回要傳遞給構造函數的參數。

最后一個想法是,因為我們放置在constructor上的唯一要求是它是一個可調用的,你甚至可以傳遞它在列表中返回你想要的東西。 例如,一種綁定方法,用於從數據庫查詢中提取結果。 這是非常有用的三行代碼。

為什么不通過在適當的循環中附加列表來保持簡單

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM