создайте диктант, используя понимание дикции, когда я получаю ключи и значения из одной и той же функции

#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 например , путем замены с).