2012-03-24 12 views
12

Estoy usando la función Python's max para encontrar el entero más grande en un diccionario llamado count, y la clave correspondiente (no estoy seguro si lo estoy diciendo correctamente; mi código probablemente explique es mejor de lo que lo estoy explicando). El diccionario count está en la línea de {'a': 100, 'b': 210}, y así sucesivamente.Usando Python's max para devolver dos valores igualmente grandes

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

¿Qué haría si hubiera dos valores iguales más grandes allí? Si tuviera {'a': 120, 'b': 120, 'c': 100}, esto solo encontraría el primero de a y b, no ambos.

+0

Lo que se hace parece demasiado complejo. Ejemplo de Fox: 'number = max (count.values ​​())'. –

+0

No me puedo resistir a las frases simples para este tipo de preguntas 'más alto, número = reducir (lambda a, b: a [0] .append (b [0]) o (a [0], b [1]) si b [1] == a [1] else (([b [0]], b [1]) si b [1]> a [1] else a), count.iteritems(), ([], -1)) ' –

Respuesta

23

idea es encontrar el valor máximo y obtener todas las claves correspondientes a ese valor:

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

highest = max(count.values()) 

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

¿Podría explicar un poco sobre lo que está haciendo Python aquí? Soy bastante nuevo en eso. – kidosu

+1

1. count.values ​​() devuelve una lista de valores, p. [120, 120, 100]. 2. max (count.values ​​()) devuelve un valor máximo de la lista, p. 120. 3. count.items() devuelve una lista de tuplas (clave, valor), p. [('a', 120), ('b', 120), ('c', 100)]. La última línea se llama lista de comprensión. Puede volver a escribir el mismo código de la siguiente manera. Iterar a través de (clave, valor) pares en el diccionario, y si el valor es el mismo que el más alto, luego agregar la clave a una lista. – Asterisk

+0

¡Gracias! ¿Hay alguna forma de no imprimir los corchetes? – kidosu

0

Esto podría ser una manera (probablemente no la más eficiente).

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

rápido de un solo paso:

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']] 

Y de forma divertida con 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

Como resultado intermedio, tiene un mapa de (valor -> [teclas]) para todos los valores. Este hecho (estructuras de datos adicionales) lo hace bastante lento (pero bastante elegante). – Tupteq

2

La misma idea que el asterisco, pero sin iterar sobre la lista dos veces. Un poco más detallado.

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

solución veces más simple puede ser la mejor:

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 

El código anterior es solución ligeramente más rápido que el de dos pasos como:

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

Por supuesto que es más largo, pero por otro mano es muy claro y fácil de leer.

+0

Se me olvidó mencionar: esta es una solución de Python 3.x, si está utilizando Python 2.x, debe reemplazar count.items() por count.iteritems(). – Tupteq

+0

No vale la pena que 'count.items()' funcione en Python 2.x también (aunque no tan eficientemente). –

0

Imprimir una lista sin el cubo. utilizar:

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

o, más extensamente del:

' '.join(str(x) for x in mylist) 
Cuestiones relacionadas