假設我有一個字典和串列,如下所示:
l: list = [1,2,3,4]
d: dict = {"Hello": "World"}
我想準確地復制這本詞典len(l)。
我想最終創建一個元組串列,如下所示:
[(1, {"Hello": "World"}),(2, {"Hello": "World"}),(3, {"Hello": "World"}),(4, {"Hello": "World"})]
要創建這個,我想我可以這樣做:
output: list = list(zip(l, repeated_dicts))
但需要在串列中復制字典指定的次數。
我嘗試使用itertools.islice,itertools.cycle但無法完全理解。有任何想法嗎?
uj5u.com熱心網友回復:
如果您需要執行實際復制,則不能簡單地使用相同的dN 次,否則串列中的所有元素都將參考同一個物件(并且修改其中任何一個都會修改所有元素)。
在您的示例中,.copy()使用生成器運算式就足夠了:
l = [1,2,3,4]
d = {"Hello": "World"}
output = list((x, d.copy()) for x in l)
copy.deepcopy如果字典還包含其他復雜物件,例如集合/串列/類/字典,您將需要:
from copy import deepcopy
output = list((x, deepcopy(d)) for x in l)
uj5u.com熱心網友回復:
您正在尋找itertools.repeat():
制作一個反復回傳物件的迭代器。除非指定了 times 引數,否則無限期運行。
請注意,回傳的字典itertools.repeat()將共享相同的記憶體;對一本字典的更改將在串列的所有元素之間共享。這會導致一些相當混亂的行為。
為避免這種情況,您可以使用map()with copy.copy()(如果字典中的所有內容都是不可變的)或copy.deepcopy()確保每個字典的記憶體是分開的:
from itertools import repeat
from copy import copy
lst = [1, 2, 3, 4]
d = {"Hello": "World"}
list(zip(lst, map(copy, repeat(d))))
這輸出:
[
(1, {'Hello': 'World'}), (2, {'Hello': 'World'}),
(3, {'Hello': 'World'}), (4, {'Hello': 'World'})
]
uj5u.com熱心網友回復:
鑒于這些字典從未被修改過,因此不需要復制/深復制。最簡單的方法(也是最少開銷)是:
output = [(i, d) for i in l]
uj5u.com熱心網友回復:
l: list = [1,2,3,4]
d: dict = {"Hello": "World"}
res = []
for num in l:
res.append((num, d.copy()))
>>>(res)
[(1, {'hello': 'World'}), (2, {'hello': 'World'}), (3, {'hello': 'World'})]
uj5u.com熱心網友回復:
在您的示例中,您似乎只復制了一次字典。也許您可以對元組使用串列推導?
l = [1, 1, 1]
d = {"Hello": "World"}
output = [(i, d.copy()) for i in range(1, len(l) 1)]
>>> output
[(1, {'Hello': 'World'}), (2, {'Hello': 'World'}), (3, {'Hello': 'World'})]
或者對于串列中的每個數字:
>>> l = [1, 1, 1]
>>> [(i, d.copy()) for i in l]
[(1, {'Hello': 'World'}), (1, {'Hello': 'World'}), (1, {'Hello': 'World'})]
或復制串列i時間:
>>> l = [1, 2, 1]
>>> [(i, [d.copy() for j in range(i)]) for i in l]
[(1, [{'Hello': 'World'}]),
(2, [{'Hello': 'World'}, {'Hello': 'World'}]),
(1, [{'Hello': 'World'}])]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/487963.html
上一篇:將資料框上的某些列轉換為字典
