как получить ключ элемента из списка словаря при использовании выражений генератора - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь узнать о выражениях генератора и о том, как они работают.

У меня есть список словаря, подобный этому,

la = [ {'app_name': 'MKV58YCF8RR','time_diff': 17647},
       {'app_name': 'ZXG68HYW4BA','time_diff': 18132}]

Я хотел получить максимальное значение time_diff из него, который я сделал, используя max

max_val = max(value["time_diff"] for value in la)

Это дает мне

18132

Но я также хочу напечатать app_name этого time_diff.

Ожидаемый выход:

ZXG68HYW4BA is 18132

Токовый выход

18132

Может кто-нибудь подскажите, пожалуйста, как мне также получитьа также клавиша app_name?

Редактировать:

Я думаю, мне нужно использовать map, но не знаете, как?

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Сначала определите максимальное значение, как вы, а затем выберите элемент с таким значением:

max_time_diff = max(item["time_diff"] for item in la)
max_item = next(item for item in la if item["time_diff"] == max_time_diff)

next() выбирает следующий элемент из итерируемого.

В этом конкретном случае эта итерация имеет длину ровно один элемент, но теоретически может быть несколько элементов с time_diff, равным max_time_diff, поэтому next() гарантирует, что только первыйсоответствующий элемент выбран.

0 голосов
/ 13 октября 2018

Используйте max на la и укажите вызываемый key, так что вы получите весь словарь с наибольшим значением для time_diff.

>>> la = [{'app_name': 'MKV58YCF8RR','time_diff': 17647},
...        {'app_name': 'ZXG68HYW4BA','time_diff': 18132}]
>>> 
>>> max_d = max(la, key=lambda d: d['time_diff']) # dict with max time_diff
>>> print('{d[app_name]} is {d[time_diff]}'.format(d=max_d))
ZXG68HYW4BA is 18132

спасибо, яне понимаю, как работает лямбда, если нет цикла для перебора всего списка.

Не отвлекайтесь на lambda.Он используется в качестве критерия, по которому можно выбрать максимальное значение la, но мы можем написать также как обычную функцию.

>>> def criterion(dictionary):
...     return dictionary['time_diff']
... 
>>> max(la, key=criterion)
{'app_name': 'ZXG68HYW4BA', 'time_diff': 18132}

max итерирует la, вызывает criterion с каждым элементом la и возвращает элемент la, где criterion является максимальным.

могу ли я извлечь его так же, как вы делали это с лямбдой, используя вместо этого itemgetter?

Конечно!

>>> import operator
>>> max_d = max(la, key=operator.itemgetter('time_diff'))
>>> print('{d[app_name]} is {d[time_diff]}'.format(d=max_d))
ZXG68HYW4BA is 18132
...