2010-06-24 2 views
18

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

MyCount= {u'10': 1, u'1': 2, u'3': 2, u'2': 2, u'5': 2, u'4': 2, u'7': 2, u'6': 2, u'9': 2, u'8': 2} 

мне нужен высокий ключ, который является 10, но я, если попытаться max(MyCount.keys()) это дает 9, как высокий.
То же самое для max(MyCount).

Словарь создан динамически.

ответ

30

Это происходит потому, что u'9' > u'10', так как они строки.

Чтобы сравнить численно, используйте int в качестве ключа.

max(MyCount, key=int) 

(Вызов .keys() обычно не требуется)

+7

Вызов 'dict.keys', как правило, лишний. –

1
max(map(int, MyCount)) 

Или, если вы хотите, возвращаемое значение будет исходная строка:

max(MyCount, key=int) 
+0

Вызов 'dict.keys' здесь (и в большинстве мест) является ненужным и потенциально неэффективным. –

1

Поскольку ключи являются строками, то они сравниваются лексикографически и «9» является максимальным значением действительно.

То, что вы ищете что-то вроде: max(int(k) for k in MyCount)

1

Это ваша проблема:

>>> u'10' > u'9' 
False 

Эффективно, вы сравнив символов '1' и '9' здесь. Что вы хотите, вероятно, так:

max(long(k) for k in MyCount) 

или создать словарь с цифрами как ключи (вместо строк).

0

Вы используете max для строковых значений. Вы должны преобразовать их в int. Попробуйте что-то вроде:

print(max([int(s) for s in MyCount.keys()])) 

Или, как Тим предложил:

print(max(int(s) for s in MyCount)) 
+1

Вам не нужны ни квадратные скобки, ни метод '.keys()'. –

+0

Спасибо, ответьте обновлен. –

17

Вам нужно сравнить фактические числовые значения. В настоящее время вы сравниваете строки лексиграфически.

max(MyCount, key=int) 
+2

единственный пифонический ответ. – SilentGhost

Смежные вопросы