2010-06-24 14 views
18

tengo un diccionario que tiene este aspectomáximo en el diccionario de

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} 

necesito tecla más alta que es 10 pero si intento max(MyCount.keys()) da 9 como el más alto.
Lo mismo para max(MyCount).

El diccionario se crea dinámicamente.

Respuesta

30

Esto se debe a u'9' > u'10', ya que son cadenas .

Para comparar numéricamente, use int como clave.

max(MyCount, key=int) 

(Calling .keys() suele ser innecesario)

+7

Llamar 'dict.keys' suele ser superfluo. –

1
max(map(int, MyCount)) 

O si desea que el valor de retorno sea la cadena original:

max(MyCount, key=int) 
+0

Llamar 'dict.keys' es aquí (y en la mayoría de los lugares) innecesario y potencialmente ineficiente. –

1

Dado que las llaves son cadenas, se comparan lexicográfico y '9' es el valor máximo de hecho.

Lo que se busca es algo así como: max(int(k) for k in MyCount)

1

Ésta es su problema:

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

Efectivamente, usted está comparando los caracteres '1' y '9' aquí. Lo que desea es probablemente esto:

max(long(k) for k in MyCount) 

o cree el diccionario con números como claves (en lugar de cadenas).

0

Utiliza max para valores de cadena. Debes convertirlos a int. Pruebe algo como:

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

O como Tim sugerido:

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

No necesita los corchetes ni el método '.keys()'. –

+0

Gracias, respuesta actualizada. –

17

Es necesario comparar los valores numéricos reales. Actualmente estás comparando las cuerdas de forma lexigráfica.

max(MyCount, key=int) 
+2

la única respuesta pitonica. – SilentGhost

Cuestiones relacionadas