Как установить определенные атрибуты словаря в [] - PullRequest
0 голосов
/ 07 сентября 2018

Давайте представим следующий словарь

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

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

Можно ли установить все значения "values" на [] без перебора ключей словаря?Я хочу что-то вроде dictionary[]["value"]=[], чтобы все атрибуты "value" были установлены на [].Но это не работает.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Я собираюсь взять другую тактику здесь. Ваш вопрос немного дезинформирован. Подразумевается, что «лучше» избегать повторения ключей словаря. Как уже упоминалось, вы можете перебирать значения словаря. Но, поскольку внутри Python хранятся словари через два массива , итерации неизбежны.

Возвращаясь к вашему основному вопросу:

Я хочу что-то вроде 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': []}}
0 голосов
/ 07 сентября 2018

Поскольку вам нужно избегать итерации, вот маленький хакерский способ решения кейса.

Преобразовать словарь в строку, заменить, а затем вернуться в словарь:

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': []}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...