2016-07-28 2 views
1

키의 존재 여부에 따라 사전 목록을 정렬하려고합니다. 내가 키 [key2, key3, key1]의 목록을 가지고 있다고 가정 해 봅시다. key2가있는 사전이 먼저오고, key3이 두 번째로오고, 마지막으로 key1이 오도록해야합니다. 키 기반 사전 목록 정렬

나는이 대답 ( Sort python list of dictionaries by key if key exists)를 보았다하지만 '키'의 값을 기반으로하지 않는 경우에만 하나의 키

정렬을 의미합니다. 그것은 키의 존재 여부와 미리 정의 된 키 목록에 달려 있습니다. 목록에서 주어진 사전 정렬 목록에서 키 하나 이상 포함되어있는 경우이

def sort_key(dict_item, sort_list): 
    key_idx = [sort_list.index(key) for key in dict_item.iterkeys() if key in sort_list] 
    if not key_idx: 
     return len(sort_list) 
    return min(key_idx) 

dict_list.sort(key=lambda x: sort_key(x, sort_list)) 

같은 대해서는, 가장 낮은 인덱스를 가지는 하나를 사용하는 방법

+3

당신이 시도한 코드를 알려주십시오. – bhansa

+0

@ Aurora0001 - 확실히 그 질문에 속지는 않습니다. 그 질문은 딕트를 정렬하는 것에 대해 묻고 있습니다.이 질문은 딕트 목록을 정렬하는 것에 관한 것입니다 ... – mgilson

+0

죄송 합니다만, 질문을 완전히 오독했습니다. – Aurora0001

답변

1

[key1 in dict, key2 in dict, ...]과 같은 목록을 사용하여 정렬하려면 sorted을 사용하면됩니다. True (즉, 키는 dict에 있음)은 False 뒤에 정렬되므로 결과를 반대로 기억하십시오.

>>> dicts = [{1:2, 3:4}, {3:4}, {5:6, 7:8}] 
>>> keys = [5, 3, 1] 
>>> sorted(dicts, key=lambda d: [k in d for k in keys], reverse=True) 
[{5: 6, 7: 8}, {1: 2, 3: 4}, {3: 4}] 

위 예에서, 즉 타이를 깰 모든 키를 사용하고, 두 키 3이 dicts 있지만, 하나는 키 1를 가지며, 따라서이 하나의 제 정렬되어있다.

+0

원래 정렬 순서를 유지하는 대신 정렬의 동작 (존재하는 순서대로 키의 수를 기반으로 묶는 방법)이 필요한 경우이 방법을 사용하는 것이 가장 좋은 방법입니다 - 글쎄, 내가 작성한 다음 버려진 버전은'tuple 키에있는 k를위한 d) '를 사용하는 것이지만 그것은 아무런 차이가 없어야합니다. 나는 넥타이의 안정성이 OP가 선호하는 행동 일 것이라고 추측했지만 문제는 어느 쪽이라도 그랬던 것처럼 아니다. –

0

. 정렬 목록에있는 키가 없으면 사전이 목록의 끝으로 보내집니다.

동일한 "최상"키 (즉, 가장 낮은 색인)를 포함하는 사전은 순서면에서 동등한 것으로 간주됩니다. 이것이 문제라면, sort_key 기능이 최선이 아닌 모든 키를 고려하는 것이 그리 어렵지 않을 것입니다. 그렇게하려면 전체 key_idx 대신 min(key_idx)의 대신 len(sort_list) 반환의 반환 [len(sort_list)] 내가 함께 할 것

0

: 키 목록에서 인덱스를 찾기 위해 발전기 식을 사용

sorted_list = sorted(dict_list, key = lambda d: next((i for (i, k) in enumerate(key_list) if k in d), len(key_list) + 1)) 

각 사전에있는 첫 x 째 키의 값을 정렬 키로 사용하십시오. 정렬 키로 len(key_list) + 1을 가져 오는 키가없는 사전은 최종 값으로 정렬됩니다.