Создание словаря, содержащего значения списка, используя понимание
В Python я хочу создать словарь, используя понимание с ключами, которые являются строками, и значениями, которые являются списками. Что я не могу понять, это как добавить элементы в эти списки. Например, рассмотрим мою следующую попытку:
{c: [].append(x[0]) for x in g16.nodes(data=True) for c in colors if x[1]['color'] == c}
g16.nodes (data = True) дает список пар, где первый элемент представляет собой строку, а второй элемент представляет собой словарь, в котором просто указывается цвет. Как уже говорилось, я хочу превратить эту структуру в словарь, где ключи дают цвет, а значения - это списки строк, которые имеют этот цвет.
Если у вас есть решение, или если есть лучший способ сделать это, пожалуйста, дайте мне знать!
Спасибо за помощь.
2 ответа
Вы пытаетесь сделать это:
{c: [x[0] for x in g16.nodes(data=True) if x[1]['color'] == c] for c in colors}
Но это не очень эффективно, так как вы зацикливаетесь на g16.nodes(data=True)
один раз для каждого цвета
Как то так лучше
d = {c: [] for c in colors}
for x in g16.nodes(data=True):
k = x[1]['color']
if k in d:
d[k].append(x[0])
Если вы знаете k
всегда в colors
Вы могли бы упростить до
d = {c: [] for c in colors}
for x in g16.nodes(data=True):
d[x[1]['color']].append(x[0])
Использование понимания словаря ключей к спискам не будет приятным. Вероятно, проще, если вы можете попробовать это:
Если предположить, g16.nodes(data=True)
это что-то вроде
[('key1', {'color': 'black'}), ('key2', {'color': 'green')]
и color
ключ существует, вы можете попробовать это:
from collections import defaultdict
gen = ((k, c['color']) for k, c in g16.nodes(data=True) if c['color'] in colors)
results = defaultdict(list)
for key, color in gen:
results[color].append(key)