2009-04-15 3 views
6

Что такое «самый питонический» способ создания словаря, где у меня есть значения в последовательности, и каждый ключ будет функцией его значения? В настоящее время я использую следующее, но я чувствую, что я просто пропускаю более чистый способ. ПРИМЕЧАНИЕ. values - это список, который не связан ни с одним словарем.Есть ли более питонический способ создания этого словаря?

for value in values: 
    new_dict[key_from_value(value)] = value 

ответ

15
>>> l = [ 1, 2, 3, 4 ] 
>>> dict((v, v**2) for v in l) 
{1: 1, 2: 4, 3: 9, 4: 16} 

В Python 3.0 вы можете использовать "Словаре понимание", который является в основном сокращением для выше:

{ v : v**2 for v in l } 
+0

Это примерно в 2.6 через какой-либо импортный трюк? –

+0

Это будет, но во IIRC никто не добрался до него. – Kiv

+0

Последнее, что я слышал, объяснял диктофоны в 2.7; Я не могу дождаться! –

18

По крайней мере, короче:

dict((key_from_value(value), value) for value in values) 
+0

... и вещий! –

0

Это метод избегает синтаксиса понимания списка:

dict(zip(map(key_from_value, values), values)) 

Я никогда не буду утверждать, что являюсь авторитетом на «Pythonic», но этот способ кажется хорошим.

+0

В этом случае, когда есть функция, уже определенная для получения ключа, я бы сказал, что любой подход хорош. Если zip/map также требовал лямбда, это могло бы рассказать о балансе в пользу понимания. В общем, если для карты или фильтра требуется лямбда, вам лучше понять. – babbageclunk

Смежные вопросы