假设我有一个字典和列表,如下所示:
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
,但不能完全得到它。什么好主意吗?
如果需要执行实际的复制,则不能简单地使用相同的d
N次,否则列表中的所有元素都将引用相同的对象(修改其中任何一个都会修改所有元素)。
在您的示例中,带有生成器表达式的.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)
你要找的是itertools.repeat()
:
创建一个反复返回object的迭代器。除非指定了times参数,否则无限期运行。
注意itertools.repeat()
返回的字典将共享相同的内存;对一个字典的更改将在列表的所有元素之间共享。这可能会导致一些相当令人困惑的行为。
为了避免这种情况,您可以使用map()
和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'})
]
考虑到这些字典永远不会被修改,copy/deepcopy就没有必要了。最简单的方法(也是开销最少的方法)是:
output = [(i, d) for i in l]
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'})]
在您的示例中,您似乎只复制了字典一次。也许您可以对元组使用列表推导?
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'}])]