2012-12-11 17 views
5
def parse_urls(weeks_urls): 
    for wkey in weeks_urls.keys(): 
     results=urllib2.urlopen(weeks_urls[wkey]) 
     lines = list(csv.reader(results)) 
     lines=clean_lines(lines) 
     week_dict=dict.fromkeys(lines[i][1] for i in range(len(lines))) 
     fare_data=list((lines[i][1:]) for i in range(3,len(lines))) 
     fare_data=get_fare_data(fare_data) 
     n=3 
     for station in week_dict: ..... 
....... 

Kiedy używam dict.fromkeys() do tworzenia dyktowania z listy ciągów, automatycznie sortuje je, tworząc dyktat z ciągami w kolejności alfabetycznej. Muszę zachować oryginalną kolejność ciągu. Czy jest jakiś sposób na zrobienie tego?Wyłączyć automatyczne sortowanie dyktów za pomocą funkcji dict.fromkeys()?

wdzięczny za pomoc tutaj

dziękuję!

Odpowiedz

7

automatycznie sortuje je, tworząc dict z łańcuchów w kolejności alfabetycznej

To nie jest do końca prawidłowe. Standardowy język Python dict jest nieuporządkowany, co oznacza, że ​​może zmieniać kolejność elementów zgodnie z oczekiwaniami. W związku z tym nie można polegać na kluczach pojawiających się w określonej kolejności (ani na kolejności pozostawania bez zmian we wszystkich wstawieniach/usunięciach).

Aby zachować kolejność wstawiania można użyć collections.OrderedDict:

In [6]: l = [1, 2, 20, 5, 10] 

In [7]: list(dict.fromkeys(l).keys()) 
Out[7]: [1, 2, 10, 20, 5] 

In [8]: list(collections.OrderedDict.fromkeys(l).keys()) 
Out[8]: [1, 2, 20, 5, 10] 
+0

to działa - dzięki! – user1799242

3

Python dictionaries są "nieuporządkowane" - Kolejność, w jakiej pozycje są uwzględniane w słowniku, zależy od implementacji (i kolejności wstawiania) i może wydawać się prawie przypadkowa lub ładnie posortowana w innym czasie (podobno). W przypadku Cpython, dla zainteresowanych czytelników, znajduje się pewna informacja: additional information.

Zamiast tego można użyć numeru collections.OrderedDict (który pamięta kolejność reklam). OrderedDict został dodany w python2.7, dla wcześniejszych wersji jest ActiveState recipe, który jest powiązany w oficjalnej dokumentacji Pythona.

Powiązane problemy