2012-04-01 27 views
8

tengo una lista:Python máximo con igual número de casos

hello = ['1', '1', '2', '1', '2', '2', '7'] 

yo quería mostrar el elemento más común de la lista, por lo que utiliza:

m = max(set(hello), key=hello.count) 

Sin embargo, me di cuenta de que podría haber dos elementos de la lista que aparecen con la misma frecuencia, como los 1 y 2 de la lista anterior. Max solo genera la primera instancia de un elemento de frecuencia máxima.

¿Qué tipo de comando podría verificar una lista para ver si dos elementos tienen el número máximo de instancias y, de ser así, darles salida a ambos? Estoy perdido aquí.

Respuesta

13

Utilizando un enfoque similar a la actual, debería en primer lugar encontrar la cuenta máxima y luego buscar todos los elementos con que cuenta:

>>> m = max(map(hello.count, hello)) 
>>> set(x for x in hello if hello.count(x) == m) 
set(['1', '2']) 

Como alternativa, puede utilizar la buena clase Counter, que puede ser utilizado de manera eficiente, así, contar cosas:

>>> hello = ['1', '1', '2', '1', '2', '2', '7'] 
>>> from collections import Counter 
>>> c = Counter(hello) 
>>> c 
Counter({'1': 3, '2': 3, '7': 1}) 
>>> common = c.most_common() 
>>> common 
[('1', 3), ('2', 3), ('7', 1)] 

continuación, puede utilizar una lista por comprensión para obtener todos los elementos que tienen la cuenta máxima:

>>> set(x for x, count in common if count == common[0][1]) 
set(['1', '2']) 
+0

¿Qué hay de veces cuando hay 3 números repetidos, como [ '1', '1', '2' '2', '8', '7', '7'] ... tu script no funcionará para eso. Gracias, de lo contrario, la solución es buena. –

+0

@james: No se puede reproducir, devuelve 'set (['1', '2', '7'])' para mí con ambos fragmentos de código. –

+0

Ah sí, no hay problema, está funcionando bien para mí ahora. Muchas gracias. –

2
from collections import Counter 

def myFunction(myDict): 
    myMax = 0 # Keep track of the max frequence 
    myResult = [] # A list for return 

    for key in myDict: 
     print('The key is', key, ', The count is', myDict[key]) 
     print('My max is:', myMax) 
     # Finding out the max frequence 
     if myDict[key] >= myMax: 
      if myDict[key] == myMax: 
       myMax = myDict[key] 
       myResult.append(key) 
      # Case when it is greater than, we will delete and append 
      else: 
       myMax = myDict[key] 
       del myResult[:] 
       myResult.append(key) 
    return myResult 

foo = ['1', '1', '5', '2', '1', '6', '7', '10', '2', '2'] 
myCount = Counter(foo) 
print(myCount) 

print(myFunction(myCount)) 

Salida:

The list: ['1', '1', '5', '2', '1', '6', '7', '10', '2', '2'] 
Counter({'1': 3, '2': 3, '10': 1, '5': 1, '7': 1, '6': 1}) 
The key is 10 , The count is 1 
My max is: 0 
The key is 1 , The count is 3 
My max is: 1 
The key is 2 , The count is 3 
My max is: 3 
The key is 5 , The count is 1 
My max is: 3 
The key is 7 , The count is 1 
My max is: 3 
The key is 6 , The count is 1 
My max is: 3 
['1', '2'] 

de escribir este sencillo programa, creo que también podría funcionar. No estaba al tanto de la función most_common() hasta que realizo una búsqueda. Creo que esto dará como resultado el elemento más frecuente que existe, funciona comparando el elemento máximo frecuente, cuando veo un elemento más frecuente, borra la lista de resultados y la agrega una vez; o si es la misma frecuencia, simplemente se agrega a ella. Y continúa hasta que todo el contador se repita.

+0

¡Este es un gran ejemplo! Muestra cómo hacerlo usted mismo si no solo está buscando la forma más fácil. – agf

+2

También aprendí algo, aprendí cómo funciona la función 'most_common()' y la marqué en caso de que en el futuro necesite esa función en particular otra vez. Así que es beneficioso para todos, ¡salud! – George

3

Editar: solución cambió

>>> from collections import Counter 
>>> from itertools import groupby 
>>> hello = ['1', '1', '2', '1', '2', '2', '7'] 
>>> max_count, max_nums = next(groupby(Counter(hello).most_common(), 
           lambda x: x[1])) 
>>> print [num for num, count in max_nums] 
['1', '2'] 
+0

+1, solución agradable y limpia. La última línea podría simplificarse marginalmente a 'd [max (d)]' :) –

+1

Gracias, ahora se ve aún mejor: D – jamylak

+0

El problema con este método es que es O (n ** 2). 'sequence.count' es O (n) y lo haces una vez para cada elemento de la secuencia.El método 'Counter', o un equivalente codificado a mano, es O (n) - el número de operaciones por artículo es independiente del número de elementos en la secuencia. – agf

Cuestiones relacionadas