2012-12-11 1 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: ..... 
....... 

dict.fromkeys()을 사용하여 문자열 목록에서 사전을 생성하면 자동으로 정렬되어 알파벳 순서로 문자열이있는 dict을 생성합니다. 문자열의 원래 순서를 유지해야합니다. 이것을 할 수있는 방법이 있습니까?dict.fromkeys()를 사용하여 자동 사전 정렬을 비활성화 하시겠습니까?

여기에 어떤 도움

감사 감사!

답변

7

은 자동으로 알파벳 순서

이 매우 정확하지에 문자열과 DICT를 생산, 그들을 정렬합니다. Python의 표준 dict은 순서가 없습니다. 즉, 항목의 순서를 바꿀 수 있습니다. 따라서 특정 순서로 나타나는 키 (삽입/삭제에서 동일하게 유지되는 순서)에 의존 할 수 없습니다.

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

이 작품 - 감사합니다! – user1799242

3

Python dictionaries은 "순서가 없습니다"- 사전에서 항목이 생성되는 순서는 구현 (및 삽입 순서)에 따라 다르며 다른 경우에는 거의 랜덤하게 표시되거나 (분명히) 정렬 될 수 있습니다. Cpython의 경우 여기에 관심있는 독자를위한 additional information이 있습니다.

대신 삽입 순서를 기억하는 collections.OrderedDict을 사용할 수 있습니다. OrderedDict이 python2.7에 추가되었습니다. 이전 버전의 경우 python 공식 문서에 링크되어있는 ActiveState recipe이 있습니다.