Stavo cercando un metodo set()
-like per deduplicare un elenco, tranne per il fatto che gli elementi che compaiono nell'elenco originale non sono lavabili (sono dict
s).Ho reinventato la ruota con questa funzione di deduplicazione?
ho trascorso un po 'alla ricerca di qualcosa di adeguato, e ho finito per scrivere questa piccola funzione:
def deduplicate_list(lst, key):
output = []
keys = []
for i in lst:
if not i[key] in keys:
output.append(i)
keys.append(i[key])
return output
a condizione che sia correttamente key
dato ed è una string
, questa funzione fa il suo lavoro abbastanza bene. Inutile dire che se imparassi un built-in o un modulo di libreria standard che consente la stessa funzionalità, lascerò volentieri la mia piccola routine a favore di una scelta più standard e robusta.
Sei a conoscenza di tale implementazione?
- Nota
Il seguente one-liner found from this answer,
[dict(t) for t in set([tuple(d.items()) for d in l])]
mentre intelligente, non funzionerà perché devo lavorare con oggetti come nidificati dict
s.
- Esempio
Per fini di chiarezza, ecco un esempio di utilizzo di tale procedura:
with_duplicates = [
{
"type": "users",
"attributes": {
"first-name": "John",
"email": "[email protected]",
"last-name": "Smith",
"handle": "jsmith"
},
"id": "1234"
},
{
"type": "users",
"attributes": {
"first-name": "John",
"email": "[email protected]",
"last-name": "Smith",
"handle": "jsmith"
},
"id": "1234"
}
]
without_duplicates = deduplicate_list(with_duplicates, key='id')
Potresti fornire una chiamata di esempio di 'deduplicate_list' nell'elenco? (Non riesco a vedere chiaramente cosa fa) :) –
Non dovresti passare una lista di chiavi? – Darina
guarda [questo] (http: // StackOverflow.it/a/8714242/5741205) risposta: potrebbe aiutarti a cancellare gli elementi del tuo elenco – MaxU