2016-05-04 18 views
6

Ho una lista di 5 milioni di elementi di stringa, che sono memorizzati come un oggetto pickle.La lista python (set (a)) cambia ogni volta il suo ordine?

a = ['https://en.wikipedia.org/wiki/Data_structure','https://en.wikipedia.org/wiki/Data_mining','https://en.wikipedia.org/wiki/Statistical_learning_theory','https://en.wikipedia.org/wiki/Machine_learning','https://en.wikipedia.org/wiki/Computer_science','https://en.wikipedia.org/wiki/Information_theory','https://en.wikipedia.org/wiki/Statistics','https://en.wikipedia.org/wiki/Mathematics','https://en.wikipedia.org/wiki/Signal_processing','https://en.wikipedia.org/wiki/Sorting_algorithm','https://en.wikipedia.org/wiki/Data_structure','https://en.wikipedia.org/wiki/Quicksort','https://en.wikipedia.org/wiki/Merge_sort','https://en.wikipedia.org/wiki/Heapsort','https://en.wikipedia.org/wiki/Insertion_sort','https://en.wikipedia.org/wiki/Introsort','https://en.wikipedia.org/wiki/Selection_sort','https://en.wikipedia.org/wiki/Timsort','https://en.wikipedia.org/wiki/Cubesort','https://en.wikipedia.org/wiki/Shellsort'] 

per rimuovere i duplicati, io uso set(a), poi ho fatto una lista di nuovo attraverso list(set(a)).

La mia domanda è:

Anche se ricomincio pitone, e leggere la lista dal file salamoia, sarà l'ordine del list(set(a)) essere lo stesso ogni volta?

Sono curioso di sapere come funziona questo hash -> list ordering.


Ho provato con un set di dati di piccole dimensioni e sembra avere un ordinamento coerente.

In [50]: a = ['x','y','z','k'] 

In [51]: a 
['x', 'y', 'z', 'k'] 

In [52]: list(set(a)) 
['y', 'x', 'k', 'z'] 

In [53]: b=list(set(a)) 

In [54]: list(set(b)) 
['y', 'x', 'k', 'z'] 

In [55]: del b 

In [56]: b=list(set(a)) 

In [57]: b 
['y', 'x', 'k', 'z'] 
+0

c'è sicuramente un elemento casuale coinvolto nella procedura di hashing. –

+0

Per i principianti, l'ordine dell'hash non è garantito, quindi l'ordine della lista non sarebbe garantito neanche. – Makoto

+0

Immagino che tu possa usare [ordered-set] (https://pypi.python.org/pypi/ordered-set) invece di 'set' – MaxU

risposta

2

suggerirei un ausiliario set() garantire unicità quando l'aggiunta di elementi nella lista, preservando così l'ordine del list(), e non memorizzare il set() per sé.

Innanzitutto, carica l'elenco e crea un set con i contenuti Prima di aggiungere elementi all'elenco, controlla che non siano nel set (ricerca molto più rapida utilizzando "in" dal set anziché dall'elenco, specialmente se ci sono molti elementi) Pickle la vostra lista, l'ordine sarà esattamente quello che si desidera

Svantaggio: prende il doppio di memoria rispetto movimentazione solo set()

Problemi correlati