2012-03-24 3 views
12

Я использую функциюPython, чтобы найти самое большое целое число в словаре под названием count и соответствующий ключ (не совсем уверен, если я говорю это правильно, мой код, вероятно, объясняет сам лучше, чем я объясняю это). Словарь count соответствует строкам {'a': 100, 'b': 210} и т. Д.Использование максимума Python для возврата двух одинаково больших значений

number = count[max(count.items(), key=operator.itemgetter(1))[0]] 
highest = max(count, key=count.get) 

Что бы я сделал, если бы там было два равных по величине значения? Если бы у меня было {'a': 120, 'b': 120, 'c': 100}, это нашло бы только первое из a и b, а не для обоих.

+0

Что вы делаете, кажется слишком сложным. Пример Fox: 'number = max (count.values ​​())'. –

+0

Я не могу устоять перед одним слоем для таких вопросов 'наивысший, number = reduce (lambda a, b: a [0] .append (b [0]) или (a [0], b [1]) если b [1] == a [1] else (([b [0]], b [1]), если b [1]> a [1] else a), count.iteritems(), ([], -1)) ' –

ответ

23

Идея найти максимальное значение и получить все ключи, соответствующие этому значению:

count = {'a': 120, 'b': 120, 'c': 100} 

highest = max(count.values()) 

print([k for k, v in count.items() if v == highest]) 
+0

Не могли бы вы немного объяснить, что здесь делает Python? Я новичок в этом. – kidosu

+1

1. count.values ​​() возвращает список значений, например. [120, 120, 100]. 2. max (count.values ​​()) возвращает максимальное значение из списка, например. 120. 3. count.items() возвращает список (ключ, значение) кортежей, например. [('a', 120), ('b', 120), ('c', 100)]. Последняя строка называется пониманием списка. Вы можете переписать тот же код следующим образом. Итерации через пары (ключ, значение) в словаре, а если значение такое же, как и максимальное, добавьте ключ в список. – Asterisk

+0

Спасибо! Есть ли способ не печатать скобки? – kidosu

0

Это может быть путь (возможно, не является наиболее эффективным).

value = max(count.values()) 
filter(lambda key: count[key]==value,count) 
1

Быстрый один проход:

a = { 'a': 120, 'b': 120, 'c': 100 } 
z = [0] 
while a: 
    key, value = a.popitem() 
    if value > z[0]: 
     z = [value,[key]] 
    elif value == z[0]: 
     z[1].append(key) 

print z 
#output: 
[120, ['a', 'b']] 

И забавный способ с defualtdict:

import collections 
b = collections.defaultdict(list) 
for key, value in a.iteritems(): 
    b[value].append(key) 
print max(b.items()) 
#output: 
(120, ['a', 'b']) 
+0

В качестве промежуточного результата у вас есть карта (значение -> [ключи]) для всех значений. Этот факт (дополнительные структуры данных) делает его довольно медленным (но довольно изящным). – Tupteq

2

Та же самая идея, как Asterisk, но без перебора списка дважды. Бит более подробный.

count = { 'a': 120, 'b': 120, 'c': 100 } 
answers = [] 
highest = -1 

def f(x): 
    global highest, answers 
    if count[x] > highest: 
     highest = count[x] 
     answers = [x] 
    elif count[x] == highest: 
     answers.append(x) 

map(f, count.keys()) 
print answers 
0

Иногда простое решение может быть лучшим:

max_value = 0 
max_keys = [] 

for k, v in count.items(): 
    if v >= max_value: 
     if v > max_value: 
      max_value = v 
      max_keys = [k] 
     else: 
      max_keys.append(k) 

print max_keys 

Код выше немного быстрее, чем два прохода решения, как:

highest = max(count.values()) 
print [k for k,v in count.items() if v == highest] 

Конечно, это больше, но с другой стороны это очень ясно и легко читать.

+0

Я забыл упомянуть - это решение Python 3.x, оно вы используете Python 2.x, вы должны заменить count.items() на count.iteritems(). – Tupteq

+0

Стоит ничего, что 'count.items()' будет работать в Python 2.x (хотя и не так эффективно). –

0

Чтобы распечатать список без ведра. Применение:

' '.join(map(str, mylist)) 

или, более пространно:

' '.join(str(x) for x in mylist) 
Смежные вопросы