возвращает ключ с наибольшим значением в словаре

#python #dictionary

Вопрос:

Я попытался изменить код в своих лекциях, который:

 [x for x in d.keys() if d[x] == max(d.values())] #It was in square-brackets which I'm not sure what it does
print(x)
 

Я также попробовал это на примере диктанта, который тоже выдал ошибку, поэтому не уверен, что пошло не так.
Сообщение об ошибке: печать(x)
Ошибка имени: имя » x » не определено

Поэтому я попытался превратить его в приведенный ниже код, потому что мне трудно понять код, когда он вставлен в строку, которая выдает неправильный вывод для ключа, содержащего наибольшее значение:

 result = []
for key in d.keys():
   if d[key] == max(d.values()):
      result.append(key)
print(result) 
 

PS, я знаю, что есть более простой способ использовать dict.get или даже использовать панд, но я не до конца понимаю это, поэтому я избегаю этого и придерживаюсь базового метода кодирования.

Дополнительные изменения: Список словаря приведен ниже: второй код выводит «VIC» (наибольшее значение из 98), а не «NSW», наибольшее значение которого равно 100

Фактический код:

 result = []
for key in humidity_for_states.keys():
   if humidity_for_states[key] == max(humidity_for_states.values()):
      result.append(key)
print(result) 
 

Словарь у меня есть:

 {'NSW': [81.0, 82.0, 99.0, 100.0, 96.0, 63.0, 85.0, 100.0, 83.0, 50.0, 83.0, 100.0, 90.0, 75.0, 58.0, 100.0, 70.0, 67.0, 100.0, 63.0, 57.0, 45.0, 57.0, 56.0],
 'QLD': [65.0, 69.0, 64.0, 80.0, 68.0, 78.0, 60.0, 77.0, 99.0, 72.0, 64.0, 71.0, 61.0, 76.0, 64.0, 44.0, 91.0, 72.0, 64.0, 41.0, 67.0, 32.0, 40.0, 37.0, 64.0, 56.0, 36.0, 37.0, 71.0, 33.0],
 'VIC': [92.0, 97.0, 94.0, 93.0, 65.0, 79.0, 83.0, 98.0, 70.0, 64.0, 86.0, 84.0, 71.0, 58.0, 63.0, 70.0, 85.0, 82.0, 46.0, 65.0, 94.0, 88.0],
 'SA': [52.0, 52.0, 57.0, 53.0, 54.0, 84.0],
 'WA': [19.0, 89.0, 53.0, 40.0, 45.0],
 'NT': [69.0, 64.0, 70.0, 67.0]}
 

Комментарии:

1. Не зная, какую ошибку вы допустили, мы не можем сказать, что вы сделали не так. Оба приведенных выше фрагмента кода верны, поэтому это должны быть данные, которые вы ввели.

2. Какой набор входных данных, которые вы пробовали, не удался? Этот код (хотя и не оптимальный с ненужной O(n^2) временной сложностью) работает на моей стороне.

3. Не могли бы вы поделиться этой «большей» ценностью вместе с другими ценностями? Мы ничего не получим просто из английских предложений, нам нужен реальный код, фактический ввод.

4. Вы не можете напечатать переменную, которая существует только в контексте понимания списка, например, в первой строке вашего первого примера. x В print(x) этот момент вход не определен, он существует только во время выполнения понимания списка. И вы также не сохраняете полученный список в переменной, так что в итоге вы ничего не получите.

5. Самый простой способ (или, что то же самое,). max(d, key=d.get) max(d, key=d.__getitem__) Если вам нужны все ключи, когда есть галстук, это maxval = max(d.values()) , maxkeys = [k for k, v in d.items() if v = maxval] . O(n) в любом случае (хотя в последнем случае вдвое больше работы, это всего два O(n) шага, что все равно O(n) ).

Ответ №1:

Вы получаете VIC , потому что сравниваете списки их обычным способом, то есть лексикографически. Вместо этого вы хотите сравнить их по максимальному значению.

Один из эффективных способов сделать это:

 maxes = list(map(max, humidity_for_states.values()))
maxmax = max(maxes)
result = [key
          for key, maxval in zip(humidity_for_states, maxes)
          if maxval == maxmax]
print(result) 
 

Другой:

 result = []
for key, vals in humidity_for_states.items():
    maxval = max(vals)
    if not result or maxval > maxmax:
        maxmax = maxval
        result = [key]
    elif maxval == maxmax:
        result.append(key)
print(result) 
 

Ответ №2:

Вы можете преобразовать свой словарь в список кортежей, содержащих пары max_humidity, location. Поскольку влажность является первым значением, максимальное значение в этом списке-ваш победитель.

 data = {'NSW': [81.0, 82.0, 99.0, 100.0, 96.0, 63.0, 85.0, 100.0, 83.0, 50.0, 83.0, 100.0, 90.0, 75.0, 58.0, 100.0, 70.0, 67.0, 100.0, 63.0, 57.0, 45.0, 57.0, 56.0],
 'QLD': [65.0, 69.0, 64.0, 80.0, 68.0, 78.0, 60.0, 77.0, 99.0, 72.0, 64.0, 71.0, 61.0, 76.0, 64.0, 44.0, 91.0, 72.0, 64.0, 41.0, 67.0, 32.0, 40.0, 37.0, 64.0, 56.0, 36.0, 37.0, 71.0, 33.0],
 'VIC': [92.0, 97.0, 94.0, 93.0, 65.0, 79.0, 83.0, 98.0, 70.0, 64.0, 86.0, 84.0, 71.0, 58.0, 63.0, 70.0, 85.0, 82.0, 46.0, 65.0, 94.0, 88.0],
 'SA': [52.0, 52.0, 57.0, 53.0, 54.0, 84.0],
 'WA': [19.0, 89.0, 53.0, 40.0, 45.0],
 'NT': [69.0, 64.0, 70.0, 67.0]}

highest = max((max(val), key) for  key,val in data.items())[1]
print(highest)
 

В основном. Если в нескольких местах одинаковая высокая влажность, выигрывает тот, который находится позже в алфавите. Вы можете получить список в случае использования связи groupby , который создает подзаголовки для элементов с одинаковым значением.

 import itertools

# sort humidity/location pairs then use first like-valued group to choose highest
sorted_humidity_pairs = sorted(((max(val), key) for  key,val in data.items()),
        reverse=True)
for _, group in itertools.groupby(sorted_humidity_pairs, key=lambda pair: pair[0]):
    highest_group = [pair[1] for pair in group]
    break
else:
    print("no data")
    exit()
print(highest_group)
 

И если вы хотите получить только один ответ с одинаковым весом для каждого местоположения, вы можете выбрать его случайным образом.

 import random
highest = random.choice(highest_group)
print(highest)