2016-05-04 16 views
6

Mam listę 5 milionów elementów ciąg, które są przechowywane jako obiekt pikle.Czy lista pythonów (zestaw (a)) zmienia za każdym razem jej kolejność?

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'] 

Aby usunąć duplikaty, używam set(a), potem zrobiłem to lista ponownie przez list(set(a)).

Moje pytanie brzmi:

Nawet gdybym ponownie uruchomić Pythona i odczytać listy z pliku marynowane, będzie kolejność list(set(a)) być taka sama za każdym razem?

Chciałbym wiedzieć, jak działa ten hash -> zamawianie list.


Testowałem z małym zestawem danych i wydaje się, że ma on spójne zamówienie.

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

jest to z pewnością element losowy udział w procedurze mieszający. –

+0

Po pierwsze, kolejność haszu nie jest gwarantowana, więc kolejność na liście nie będzie gwarantowana. – Makoto

+0

Domyślam się, że możesz użyć [uporządkowanego zestawu] (https://pypi.python.org/pypi/ordered-set) zamiast "set" – MaxU

Odpowiedz

2

Proponuję pomocniczy set() celu zapewnienia unikalności podczas dodawania pozycji na liście, tym samym zachowując kolejność list() i nie składowano set() per se.

Najpierw załaduj listę i utwórz zestaw z zawartością Przed dodaniem elementów do listy sprawdź, czy nie ma ich w zestawie (znacznie szybsze wyszukiwanie za pomocą "in" z zestawu, a nie z listy, szczególnie jeśli istnieje wiele elementów) marynacie lista, kolejność będzie dokładnie jeden chcesz

wadę: zajmuje dwa razy więcej pamięci niż obsługa tylko set()