New2Coding
New2Coding

Reputation: 191

How to set specific attributes of a dictionary to []

Let us imagine the following dictionary

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

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

Is it possible to set all the "values" to [] without iterating over the dictionary keys? I want something like dictionary[]["value"]=[] such that all "value" attributes are set to []. But that doesn't work.

Upvotes: 1

Views: 207

Answers (2)

jpp
jpp

Reputation: 164653

I'm going to take a different tack here. Your question is a little misinformed. The implication is that it's "better" to avoid iterating dictionary keys. As mentioned, you can iterate over dictionary values. But, since internally Python stores dictionaries via two arrays, iteration is unavoidable.

Returning to your core question:

I want something like dictionary[]["value"]=[] such that all "value" attributes are set to [].

Just use collections.defaultdict:

from collections import defaultdict

d = {k: defaultdict(list) for k in dictionary}

print(d['key1']['value'])  # []
print(d['key2']['value'])  # []

For the dictionary structure you have defined, this will certainly be more efficient than string conversion via repr + regex substitution.

If you insist on explicitly setting keys, you can avoid defaultdict at the cost of an inner dictionary comprehension:

d = {k: {i: [] for i in v} for k, v in dictionary.items()}

{'key1': {'value': []}, 'key2': {'value': []}}

Upvotes: 1

Austin
Austin

Reputation: 26039

Because you need to avoid iteration, here is a little hacky way of solving the case.

Convert dictionary to string, replace and then back to dictionary:

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

Upvotes: 5

Related Questions