将Python字典复制N次到列表中



假设我有一个字典和列表,如下所示:

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.isliceitertools.cycle,但不能完全得到它。什么好主意吗?

如果需要执行实际的复制,则不能简单地使用相同的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)

你要找的是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'}])]

相关内容

  • 没有找到相关文章

最新更新