¿Cómo encontrar el elemento más común en la lista, y si hay un empate, el que tuvo lugar por última vez es el primero?

Básicamente si se le da una lista

events = [123,123,456,456,456,123] 

Espero que devuelva 456 porque 456 fue visto por última vez antes de 123 fue visto por última vez.

Hice listas compuestas de los recuentos e índices de la lista inicial de números. También hice un diccionario en el que la clave es el elemento de los eventos (parte original) y el valor hte es el .count() de la clave.

Realmente no sé a dónde ir desde aquí y podría necesitar ayuda.

Enfoque

Encuentra los elementos que ocurren con mayor frecuencia (Counter.most_common). Luego, busque el elemento entre los candidatos que tiene el índice mínimo (enumérelo en un diccionario de índices, mínimo de {index: key} .iteritems ()).

Código

Robando generosamente de @gnibbler y @Jeff:

 from collections import Counter def most_frequent_first(events): frequencies = Counter(events) indexes = {event: i for i, event in enumerate(events)} most_frequent_with_indexes = {indexes[key]: key for key, _ in frequencies.most_common()} return min(most_frequent_with_indexes.iteritems())[1] events = [123,123,456,456,456,123, 1, 2, 3, 2, 3] print(most_frequent_first(events)) 

Resultado

 >>> print(most_frequent_first(events)) 456 

Código

Una mejor pieza de código le proporcionaría la frecuencia y el índice, lo que le muestra que el código funciona correctamente. Aquí hay una implementación que usa un named_tuple:

 from collections import Counter, namedtuple frequent_first = namedtuple("frequent_first", ["frequent", "first"]) def most_frequent_first(events): frequencies = Counter(events) indexes = {event: i for i, event in enumerate(events)} combined = {key: frequent_first(value, indexes[key]) for key, value in frequencies.iteritems()} return min(combined.iteritems(), key=lambda t: (-t[1].frequent, t[1].first)) events = [123,123,456,456,456,123, 1, 2, 3, 2, 3] print(most_frequent_first(events)) 

Resultado

 >>> print(most_frequent_first(events)) (456, frequent_first(frequent=3, first=4)) 

Utilice collections.counter

 >>> import collections >>> events = [123,123,456,456,456,123] >>> counts = collections.Counter(events) >>> print counts Counter({456: 3, 123: 3}) >>> mostCommon = counts.most_common() >>> print mostCommon [(456, 3), (123, 3)] 

Esa es la parte difícil.

 >>> from collections import Counter >>> events = [123,123,456,456,456,123] >>> c = Counter(events) >>> idxs = {k: v for v,k in enumerate(events)} >>> sorted(c.items(), key=lambda (k,v): (-v, idxs[k])) [(456, 3), (123, 3)]