[英]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)
,它有兩個隱藏的循環( [[]] * 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(用整數索引)而不是列表,這可能是也可能不是你想要的。 或者你可以創建一個類似於列表的類,但是將新列表附加到自身而不是引發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.