1

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.

New2Coding
  • 181
  • 13

2 Answers2

5

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': []}}
Austin
  • 25,759
  • 4
  • 25
  • 48
1

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': []}}
jpp
  • 159,742
  • 34
  • 281
  • 339