如何将字典的特定属性设置为[]

时间:2018-09-07 15:57:17

标签: python dictionary

让我们想象一下以下字典

dictionary = {
    "key1": {
         "value": [1, 3, 5],
     },

    "key2": {
         "value": [1, 2, -1],
     },
}

是否可以在不迭代字典键的情况下将所有"values"设置为[]?我想要类似dictionary[]["value"]=[]的东西,以便将所有“值”属性都设置为[]。但这不起作用。

2 个答案:

答案 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': []}}