2016-08-11 6 views
0

최근에 파이썬으로 프로그래밍을 시작했으며 질문에 답을 얻을 수 없습니다. 나는 여러 가지 키와 값을 가진 방대한 사전 목록을 가지고있다. 목록에 나타나는 사전의 순서를 정렬하고 싶습니다. list_one :두 가지 기준에 대한 사전 목록 정렬

list_one = [{'country': 'Spain',  'id': 'v1', 'key2': 'value2'}, 
      {'country': 'France', 'id': 'v4', 'key2': 'value2'}, 
      {'country': 'China',  'id': 'v4', 'key2': 'value2'}, 
      {'country': 'Russia', 'id': 'v3', 'key2': 'value2'}, 
      {'country': 'Australia', 'id': 'v2', 'key2': 'value2'}, 
      {'country': 'China',  'id': 'v3', 'key2': 'value2'}, 
      ... 
      ] 

첫째, 종류에 'ID'값 (v1, v2, v3, ...) (I 잘 해결할 수있다).

또한 id 값이 비슷한 경우 'country' 키의 값에 따라 정렬하십시오. Bu 나는 알파벳 순으로 정렬하고 싶지 않다. 나는이 국가들에 설정된 가치에 기초하여 분류 할 수 있기를 바랍니다. 예를 들어 France = 1, China = 2, Australia = 3, Spain = 4, Russia = 5과 같이

사전의 순서는 두 번째 예와 같습니다. list_two :

[{'country': 'Spain',  'id': 'v1', 'key2': 'value2'}, 
{'country': 'Australia', 'id': 'v2', 'key2': 'value2'}, 
{'country': 'China',  'id': 'v3', 'key2': 'value2'}, 
{'country': 'Russia', 'id': 'v3', 'key2': 'value2'}, 
{'country': 'France', 'id': 'v4', 'key2': 'value2'}, 
{'country': 'China',  'id': 'v4', 'key2': 'value2'} 
... 
] 

그 dicts 다음 몇 가지 '암시 적 가치'세트에 먼저 'ID'키의 값에, 목록에 표시 아래와 같이하고, 순서를 정렬 할 수있는 파이썬 방법이 있나요 국가들?

list_two = sorted(
    list_one, 
    key=lambda k: (k['id'], country_ordering.get(k['country'], float('inf'))) 
:

country_ordering = {'France': 1, 'China': 2, 'Australia': 3, 
        'Spain': 4, 'Russia': 5} 

는 다음 id 그 매핑의 값으로 튜플을 반환하여 정렬 키에 그것을 사용

list_two = sorted(list_one, key=lambda k: k['id']) 

답변

3

숫자 주문에 따라 사전지도 국가 이름을 생산

dict.get() 메서드를 사용하여 순서 값을 조회했습니다. 그런 식으로 해당 국가가 아직 매핑되지 않은 경우에 대비하여 기본값을 지정할 수 있습니다. 위의 예는 float('inf') (무한대)을 기본값으로 사용합니다. 즉, 나열되지 않은 국가는 끝에 지정됩니다 (주어진 id에 따라). 스트레이트 키 조회를 할

lambda k: (k['id'], country_ordering[k['country']]) 

: 당신은 예외가 대신 던져 질하려면

는에 람다를 변경합니다.

데모 :

>>> list_one = [{'country': 'Spain',  'id': 'v1', 'key2': 'value2'}, 
...    {'country': 'France', 'id': 'v4', 'key2': 'value2'}, 
...    {'country': 'China',  'id': 'v4', 'key2': 'value2'}, 
...    {'country': 'Russia', 'id': 'v3', 'key2': 'value2'}, 
...    {'country': 'Australia', 'id': 'v2', 'key2': 'value2'}, 
...    {'country': 'China',  'id': 'v3', 'key2': 'value2'}] 
>>> country_ordering = {'France': 1, 'China': 2, 'Australia': 3, 'Spain': 4, 'Russia': 5} 
>>> sorted(list_one, key=lambda k: (k['id'], country_ordering[k['country']])) 
[{'country': 'Spain', 'id': 'v1', 'key2': 'value2'}, {'country': 'Australia', 'id': 'v2', 'key2': 'value2'}, {'country': 'China', 'id': 'v3', 'key2': 'value2'}, {'country': 'Russia', 'id': 'v3', 'key2': 'value2'}, {'country': 'France', 'id': 'v4', 'key2': 'value2'}, {'country': 'China', 'id': 'v4', 'key2': 'value2'}] 
>>> pprint(_) 
[{'country': 'Spain', 'id': 'v1', 'key2': 'value2'}, 
{'country': 'Australia', 'id': 'v2', 'key2': 'value2'}, 
{'country': 'China', 'id': 'v3', 'key2': 'value2'}, 
{'country': 'Russia', 'id': 'v3', 'key2': 'value2'}, 
{'country': 'France', 'id': 'v4', 'key2': 'value2'}, 
{'country': 'China', 'id': 'v4', 'key2': 'value2'}] 
+0

덕분에, 그 위대한 작품! 하나의 추가 질문. 'ids'에 대한 주문이 이미 올바르게 수행 된 경우 동일한 '국가'로만 해당 딕테이션을 다시 주문하고 싶습니다. – PDavis

+0

@PDavis : 전체 키로 정렬해야합니다. 파이썬이 사용하는 정렬 알고리즘 ([* Timsort *] (https://en.wikipedia.org/wiki/Timsort))은 이미 정렬 된 서브 섹션을 이용한다. –

+0

나는 같은 'ids'를 가진 그 딕트들을 의미했다. – PDavis