Rimuovere i duplicati dall'elenco e ordinarli per conteggio? (pitone 3)

Aug 19 2020

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 setma 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

2 xnor Aug 20 2020 at 17:37

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 lambdae usando reverseper 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 {}.fromkeystrucco 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!