我想制作一个python数据结构的深层副本,忽略一些基于某些标准的元素。
例如,输入可以是任意的json,我想复制所有但字典中带有'ignore'键的字典。像这样:
def my_filter(entry):
# return true if we need to skip this entry
if not isinstance(entry, dict): return False
return ('ignore' in entry)
a = [
{"free": "yourself", "ignore": ""},
[
{"two": "words" },
{"one": "finger"},
[{"apples": 2}, {"array": [1,2,3,4], "ignore": ""}],
],
{"hi": "there", "ignore": ""},
]
print copy_with_filter(a, my_filter)
并输出
[[{'two': 'words'}, {'one': 'finger'}, [{'apples': 2}]]]
我已经实现了这个为json输入工作的代码,也就是当只有list,dict或literals可以存在时,它运行良好:
def copy_with_filter(a, filter_func):
# assume input is either list, or dict, or "literal" (i.e. string/int/float)
if isinstance(a, list):
out = [ copy_with_filter(x, filter_func) for x in a if not filter_func(x) ]
elif isinstance(a, dict):
out = a.copy() # shallow copy first
for k in a.iterkeys():
# replace values with filtered deep copies
out[k] = copy_with_filter(a[k], filter_func)
else:
out = a
return out
虽然我的问题是在python中使用过滤进行深层复制是否有更通用/更好/内置的方式?
答案 0 :(得分:1)
使用带有memoization的Python深度复制 - 在深度复制具有交叉引用资源的结构时效果更好 - 您的方法将创建在根对象的子项中多次引用的事物的副本。
有点可怕的Python文档:
https://docs.python.org/2/library/copy.html
...但是那里有很好的教程。一篇关于重载自定义类的复制构造函数的SO帖子:
Python: Implementation of shallow and deep copy constructors
添加过滤更加繁琐 - 但对于自定义对象来说,这很容易(早在 deepcopy 构造函数的早期,没有在备忘录中添加新对象 - 唯一真正的难点是管道在自定义过滤规则中,但这只是管道)。