让我们想象一下以下字典
dictionary = {
"key1": {
"value": [1, 3, 5],
},
"key2": {
"value": [1, 2, -1],
},
}
是否可以在不迭代字典键的情况下将所有"values"
设置为[]
?我想要类似dictionary[]["value"]=[]
的东西,以便将所有“值”属性都设置为[]
。但这不起作用。
答案 0 :(得分:5)
因为您需要避免迭代,因此这是解决问题的一种小巧方式。
将字典转换为字符串,替换后再返回字典:
import re, ast
dictionary = {
"key1": {
"value": [1, 3, 5],
},
"key2": {
"value": [1, 2, -1],
},
}
print(ast.literal_eval(re.sub(r'\[.*?\]', '[]', str(dictionary))))
# {'key1': {'value': []}, 'key2': {'value': []}}
答案 1 :(得分:1)
我将在这里采取不同的方针。您的问题有点误会。这意味着避免迭代字典键是“更好的”。如前所述,您可以遍历字典值。但是,由于在内部使用Python stores dictionaries via two arrays,因此不可避免地需要进行迭代。
回到您的核心问题:
我想要类似
dictionary[]["value"]=[]
这样的东西,以使所有“值” 属性设置为[]
。
只需使用collections.defaultdict
:
from collections import defaultdict
d = {k: defaultdict(list) for k in dictionary}
print(d['key1']['value']) # []
print(d['key2']['value']) # []
对于您定义的字典结构,这肯定比通过repr
+正则表达式替换进行字符串转换更有效。
如果您坚持显式设置键,则可以避免使用defaultdict
,而要花很多心思来理解字典:
d = {k: {i: [] for i in v} for k, v in dictionary.items()}
{'key1': {'value': []}, 'key2': {'value': []}}