如何深度复制复制字典列表?
How to deep copy duplicate a list of dictionaries?
我有一个字典列表:
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)]
但同样的问题。
这种方法奏效了,但我觉得它不是很 pythonic,这就是为什么我正在寻找更好的答案。
from copy import deepcopy
my_new_list = [deepcopy(my_list[i % len(my_list)]) for i in range(4)]
我如何创建这个深拷贝乘法列表?
只需使用 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'}]
你可以使用乘法方法 dict.copy()
假设你的 dicts 像你的例子中的那样浅。
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'}]
这个怎么样?在我看来非常 pythonic...
my_list.extend(deepcopy(my_list))
这当然会覆盖 my_list
。如果你想保留它,只需预先将 my_list
深度复制到 my_new_list
(或执行添加两个 my_list
的深度复制)。
这种方式应该适用于任何对象(可以深度复制),而不是依赖于 dict
定义的行为
可以使用copy模块进行深拷贝,
试试这个
import copy
my_list = [{'key1': 'value1',},{'key2': 'value2',},]
my_list = my_list + copy.deepcopy(my_list)
my_list[0]['key1'] = 'next'
print(my_list)
我正在努力解决为什么原始发帖人的解决方案被视为 "not 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 让您指定元素的数量
deepcopy 是为了可重用性,以防个别 dicts 的内部数据在浅拷贝中可能不安全(与发布的示例不同)——因为它在问题标题中。
map 让我 return 可以迭代 deepcopy 结果,所以如果你想要一个列表,你可以拥有它,但你可以随心所欲地使用它。
郑重声明,我对模运算解决方案很满意。数学仍然适用于 python!
我有一个字典列表:
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)]
但同样的问题。
这种方法奏效了,但我觉得它不是很 pythonic,这就是为什么我正在寻找更好的答案。
from copy import deepcopy
my_new_list = [deepcopy(my_list[i % len(my_list)]) for i in range(4)]
我如何创建这个深拷贝乘法列表?
只需使用 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'}]
你可以使用乘法方法 dict.copy()
假设你的 dicts 像你的例子中的那样浅。
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'}]
这个怎么样?在我看来非常 pythonic...
my_list.extend(deepcopy(my_list))
这当然会覆盖 my_list
。如果你想保留它,只需预先将 my_list
深度复制到 my_new_list
(或执行添加两个 my_list
的深度复制)。
这种方式应该适用于任何对象(可以深度复制),而不是依赖于 dict
定义的行为
可以使用copy模块进行深拷贝, 试试这个
import copy
my_list = [{'key1': 'value1',},{'key2': 'value2',},]
my_list = my_list + copy.deepcopy(my_list)
my_list[0]['key1'] = 'next'
print(my_list)
我正在努力解决为什么原始发帖人的解决方案被视为 "not 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 让您指定元素的数量
deepcopy 是为了可重用性,以防个别 dicts 的内部数据在浅拷贝中可能不安全(与发布的示例不同)——因为它在问题标题中。
map 让我 return 可以迭代 deepcopy 结果,所以如果你想要一个列表,你可以拥有它,但你可以随心所欲地使用它。
郑重声明,我对模运算解决方案很满意。数学仍然适用于 python!