Найти - Пользователи
Полная версия: Найти max value с определенным именем в dict
Начало » Python для новичков » Найти max value с определенным именем в dict
1
Kurtz
Здравствуйте. Есть dict:

>>> data = {'John': {'salary': 365788, 'to_messages': 807, 'deferral_payments': 'NaN', 'total_payments': 1061827},
            'Peter': {'salary': 284896, 'to_messages': 624, 'deferral_payments': 'NaN',  'total_payments': 4583126}}

Как найти наибольшее значение total_payments с соответствующим именем?
sander
Kurtz
цикл for
junga_py
data = {'John': {'salary': 365788, 'to_messages': 807, 'deferral_payments': 'NaN', 'total_payments': 1061827}, 'Peter': {'salary': 284896, 'to_messages': 624, 'deferral_payments': 'NaN',  'total_payments': 4583126}}
max = list(list(data.values())[0].values())[0]
for x in data.values():
    for y in x.values():
        w = float(y)
        if max < w:
            max = w
print(max)
py.user.next
>>> data = {'John': {'salary': 365788,
...                  'to_messages': 807,
...                  'deferral_payments': 'NaN',
...                  'total_payments': 1061827},
...         'Peter': {'salary': 284896,
...                   'to_messages': 624,
...                   'deferral_payments': 'NaN',
...                   'total_payments': 4583126}}
>>> 
>>> max((data[i]['total_payments'], i) for i in data)
(4583126, 'Peter')
>>>
Kurtz
junga_py
ValueError: could not convert string to float: mark.metts@enron.com

py.user.next
('NaN', 'WROBEL BRUCE')

Ответ вроде должен быть (103559793, ‘LAY KENNETH L’).

Общий файл в приложении. Нужно было это сразу сделать, прошу прощения за предоставление неполной информации.
Kurtz
Вроде получилось:
>>> max_total_payments = max([enron_data[e]['total_payments'] for e in enron_data if e != 'TOTAL' if enron_data[e]['total_payments'] != 'NaN'])
>>> person_with_max_total_payments = [name for name in enron_data if enron_data[name]['total_payments'] == max_total_payments]
>>> print max_total_payments, person_with_max_total_payments
103559793 ['LAY KENNETH L']
Спасибо всем за помощь! py.user.next, вы мне дали правильное направление поиска.
py.user.next
Короче, надо словарь сначала правильно составить, подготовить к поиску.
Kurtz
py.user.next
Ваше решение было изначально правильным, я просто не учел что в Python str считается больше чем int или float, поэтому max() всегда вернет ‘NaN’ или любой другой str вместо числового значения:
>>> d = [10, 100, 0, 1000, 'str']
>>> print max(d)
str
py.user.next
Kurtz
в Python str считается больше чем int или float
Это уже давно не работает. Какой-то пережиток из второго питона, который убрали уже.
>>> '' > 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() > int()
>>> 
>>> b'' > 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: bytes() > int()
>>>

Нужно исключить строки из сравнений чисел.
Kurtz
Я пока в 2.7 работаю. В третьем убрали, наверное.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB