Использование максимума Python для возврата двух одинаково больших значений - PullRequest
16 голосов
/ 24 марта 2012

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

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

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

Ответы [ 6 ]

28 голосов
/ 24 марта 2012

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

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

highest = max(count.values())

print([k for k, v in count.items() if v == highest])
2 голосов
/ 24 марта 2012

Та же идея, что и у 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
1 голос
/ 24 марта 2012

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

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 голосов
/ 24 марта 2012

Для печати списка без ведра. использование:

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

или, более подробно:

' '.join(str(x) for x in mylist)
0 голосов
/ 24 марта 2012

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

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 голосов
/ 24 марта 2012

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

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