Создание словаря, содержащего значения списка, используя понимание

В 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)
Другие вопросы по тегам