2016-03-27 8 views
5

Stavo cercando di scrivere una funzione per rimuovere i duplicati da un elenco in Python.Perché il set è ordinato quando si converte una lista da impostare?

Ma dopo averlo fatto, ho trovato la lista ordinata convertendola in set e in un elenco.

Ecco lo script:

>>> l = [9,10,10,11,1,1,1,22,2,2,2] 
>>> s = set(l) 
>>> s 
set([1, 2, 9, 10, 11, 22]) 
>>> l2 = list(s) 
>>> l2 
[1, 2, 9, 10, 11, 22] 
>>> l2 = list(set(l)) 
>>> l2 
[1, 2, 9, 10, 11, 22] 
>>> 

Il set s è ordinato (almeno ordinato la stampa di esso).

Perché il set è ordinato?

E qual è la complessità temporale se rimuovere i duplicati eseguendo questo:

def remove_duplicates(nums): 
    return list(set(nums)) 
+0

Brevemente: oggetti 'set' sono arbitrariamente ordinate. – TigerhawkT3

+2

@ TigerhawkT3 Per favore non essere così aggressivo in chiusura. C'è di più nella questione che solo un ordinamento arbitrario. –

+0

'set_l = [x per (i, x) in enumerate (l) if l.index (x) == i]' –

risposta

6

Il tempo di esecuzione per l'approccio list(set(data)) è O (n).

Il set appare ordinato come artefatto di come i numeri interi sono sottoposti a hash. Con altri input, i dati si allontaneranno dall'ordine ordinato.

Per superare ordine arbitrario, utilizzare questo linguaggio che è anche O (n): list(collections.OrderedDict.fromkeys(data))

+1

Gocha! Hai ragione. E dopo averlo testato con numeri molto grandi, la lista restituita non è stata ordinata. Grazie mille. – xhanshawn

+0

Il tuo nuovo approccio è O (n log n) non è così? –

+0

@TimothyShields Non lo è. Il numero di confronti è O (n). Questo facile da verificare attraverso la strumentazione. –

Problemi correlati