Rimuovere i duplicati dall'elenco e ordinarli per conteggio? (pitone 3)
Come rimuovo tutti i duplicati dall'elenco e li ordino in base al conteggio?
s = ["foo", "this", "lem", "foo", "lem"]
s = ["foo", "ebh", "wosv", "wosv", "ebh", "4whcu"]
#should return
>>> ["foo", "lem", "this"]
>>> ["ebh", "wosv", "foo", "4whcu"]
Regole:
- Deve essere più breve del codice seguente in termini di dimensione in byte.
- L'ordine deve essere basato sul conteggio di in ordine decrescente.
- Se ci sono due stringhe con lo stesso conteggio, la prima apparizione viene prima
- Tutti i duplicati devono essere rimossi, solo uno di ogni stringa dovrebbe essere nell'elenco finale
Attualmente ho
list({}.fromkeys(sorted(s,key=lambda y:-s.count(y))))
Ho notato risposte come set
ma che cambiano arbitrariamente l'ordine, cosa che non voglio.
Edit: Ci scusiamo per la scarsa qualità prima. L'avevo frustato proprio prima di dormire ed ero abbastanza stanco. Questo non è per StackOverflow perché sto cercando di giocare a golf/accorciare il più possibile le dimensioni di questo codice. Ho provato a cercare risposte ma non sono riuscito a trovare nulla.
Risposte
44 byte
sorted({}.fromkeys(s),key=s.count,reverse=1)
Provalo online!
Un miglioramento rispetto a quanto segue, sostituendo la chiave con un built-in anziché un lambda
e usando reverse
per scambiare i confronti. Vorremmo [::-1]
invece fare sul risultato finale, ma questo non fa i giusti tiebreak stabili.
47 byte
sorted({}.fromkeys(s),key=lambda y:-s.count(y))
Provalo online!
Una semplice trasposizione del tuo codice, spostando il tuo {}.fromkeys
trucco di deduplicazione prima dell'ordinamento. Poiché l'ordinamento si converte in un elenco, estraendo le chiavi da un dizionario, ciò salva la list()
chiamata dell'originale.
Per comodità di riferimento, il codice originale è:
53 byte
list({}.fromkeys(sorted(s,key=lambda y:-s.count(y))))
Provalo online!