2013-11-20 2 views
1

В python Я хочу создать словарь, используя понимание с ключами, которые являются строками, и значениями, которые являются списками. Я не могу понять, как добавить элементы в эти списки. Для примера рассмотрим следующую мою попытку:создание словаря, содержащего значения списка с использованием понимания

{c: [].append(x[0]) for x in g16.nodes(data=True) for c in colors if x[1]['color'] == c} 

g16.nodes (данные = True) дает список пар, где первый элемент является строкой, а второй элемент представляет собой словарь, который просто определяет цвет. Как уже было сказано, я хочу сделать эту структуру в словаре, где ключи дают цвет, а значения - это списки строк, которые имеют этот цвет.

Если у вас есть решение или если есть лучший способ сделать это, пожалуйста, дайте мне знать!

Спасибо за помощь.

+0

'list.append' не возвращает None, поэтому все значения словаря будут None. –

+1

Используйте петлю, а не понимание. Вы рискуете написать непостижимое понимание! – dawg

+0

Правило большого пальца, если вам нужно мутировать в понимании, тогда понимание не является решением. – thefourtheye

ответ

3

Вы пытаетесь сделать это:

{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]) 
+0

Я просто печатал об этом же ответе! – dawg

+0

@dawg Великие мысли думают одинаково: P – thefourtheye

+1

Вы также можете использовать 'collections.defaultdict (list)' for 'd'. Это классическое использование. –

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) 
Смежные вопросы