我有一些字典:
my_list = [
{
'key1': 'value1',
},
{
'key2': 'value2',
},
]
我想像这样将列表相乘:
my_new_list = [
{
'key1': 'value1',
},
{
'key2': 'value2',
},
{
'key1': 'value1',
},
{
'key2': 'value2',
},
]
我尝试了my_list * 2
方法,但是它会创建浅表副本,这意味着如果我修改一个字典,最终会修改列表中的其他副本。我想我正在寻找更深的副本。
我也尝试过:
my_new_list = [my_list[i % len(my_list)] for i in range(4)]
但同样的问题。
这种方法行得通,但对我来说却不是很Python,这就是为什么我在寻找更好的答案。
from copy import deepcopy
my_new_list = [deepcopy(my_list[i % len(my_list)]) for i in range(4)]
如何创建深拷贝副本列表?
答案 0 :(得分:2)
您可以将乘法与dict.copy()
一起使用,假设您的字典像您的示例一样浅。
l = [{'k1': 'v1'}, {'k2': 'v2'}]
result = [d.copy() for d in l * 2]
result[0]['k1'] = 'changed'
print(result)
# [{'k1': 'changed'}, {'k2': 'v2'}, {'k1': 'v1'}, {'k2': 'v2'}]
答案 1 :(得分:1)
您可以使用复制模块进行深层复制, 试试这个
import copy
my_list = [{'key1': 'value1',},{'key2': 'value2',},]
my_list = my_list + copy.deepcopy(my_list)
my_list[0]['key1'] = 'next'
print(my_list)
答案 2 :(得分:0)
只需使用dict.copy()
方法来制作dict
对象的文字副本。
my_new_list = [my_list[i % len(my_list)].copy() for i in range(len(my_list) * 2)]
现在要验证,让我们更改第一个dict对象的值,
my_new_list[0]['key1'] = 'value3'
print(my_new_list)
输出:
[{'key1': 'value3'}, {'key2': 'value2'}, {'key1': 'value1'}, {'key2': 'value2'}]
答案 3 :(得分:0)
这个怎么样?在我看来非常 pythonic ...
my_list.extend(deepcopy(my_list))
这当然会覆盖my_list
。如果要保留它,只需事先将my_list
深度复制到my_new_list
(或执行my_list
的两个深度复制)。
这种方法应该适用于任何对象(可以进行深度复制),而不是依靠dict
的已定义行为
答案 4 :(得分:0)
我正为为什么原始海报的解决方案被视为“非pythonic”而苦苦挣扎。您确实需要一个理由来丢掉这个标签。但是,看看他们的模算术答案,我想这不只是将列表加倍,而是将其用作重复模板以将新列表填充为任意大小。
from copy import deepcopy
from itertools import islice, cycle
def fill(iterable, size):
return map(deepcopy, islice(cycle(iterable), size))
print (list(fill(my_list, 4)))
itertools.cycle提供重复行为
itertools.islice可让您指定元素数
深度复制用于可重用性,以防单个字典具有内部数据,而内部数据在浅表副本中可能并不安全(与所发布的示例不同),并且因为它位于问题标题中。
map让我返回了深度拷贝结果的可迭代结果,因此,如果您想要一个列表,可以拥有它,但是可以随意使用它。
记录下来,我对模算术解决方案感到满意。数学仍然可以在python中工作!