#python #dictionary-comprehension
Вопрос:
Предположим, у меня есть сложная функция get_stuff
, которая принимает значение int и возвращает кортеж, 1-й элемент имеет тип str. Следующий пример имеет такое же поведение, но предположим, что реальная функция более сложна и ее нелегко разделить на две части:
def get_stuff(x):
return str(5*x),float(3*x)
Я хочу создать диктант,пары (ключ, значение) которого являются результатами get_stuff при вызове определенного набора целых чисел. Одним из способов сделать это было бы:
def get_the_dict(set_of_integers):
result = {}
for i in set_of_integers:
k,v = get_stuff(i)
result[k] = v
return result
Я бы предпочел использовать для этого понимание диктанта, но я не знаю, можно ли разделить пару внутри понимания, чтобы уловить ключ и значение отдельно.
def get_the_dict_with_comprehension(set_of_integers):
return {get_stuff(i) for i in set_of_integers} #of course this doesn't work
Как я могу этого достичь?
Ответ №1:
Вы можете сделать это, не совсем понимая словарь:
dict(get_stuff(i) for i in range(10))
Комментарии:
1. Построение словаря на основе понимания — это достаточно близко для джаза.
2. @Joffan Из выражения генератора, если быть точным.
Ответ №2:
Если вы действительно хотите использовать dict
понимание, вы можете сделать следующее:
{k: v for k, v in [get_stuff(i) for i in set_of_integers]}
Ответ №3:
Вместо понимания вы также можете сопоставить набор целых dict
чисел конструктору с парами ключ-значение, возвращаемыми get_stuff
:
dict(map(get_stuff, set_of_integers))
Комментарии:
1. Есть ли в этом какое-то преимущество?
2. Это самый лаконичный и элегантный ответ, даже несмотря на то, что сопровождающие Python не слишком любят
map
/reduce
и вместо этого предпочитают генераторные выражения.3. Следует ли использовать императивный стиль (с пониманием) или функциональный стиль (с
map
) в этом случае в основном зависит от личных предпочтений, хотя использованиеmap
облегчает применение параллельной обработки для ускорения преобразования (map
multiprocessing.Pool.map
например , путем замены с).