2017-10-12 3 views
-1

내 코드는 다음과 같습니다사전 목록을 상대 날짜 값으로 정렬하는 방법은 무엇입니까?

a = {"key1": 5 , "key2": "8 hours ago", "key3": 2} 
b = {"key1": 7 , "key2": "42 hours ago", "key3": 9} 
c = {"key1": 6 , "key2": "1 hour ago", "key3": 1} 
undecorated = [a, b, c] 

undecorated.sort(key=operator.itemgetter('key2')) 

결과는 다음과 같습니다

[ 
{"key1": 6 , "key2": "1 hour ago", "key3": 1} 
{"key1": 7 , "key2": "42 hours ago", "key3": 9} 
{"key1": 5 , "key2": "8 hours ago", "key3": 2} 
] 

하지만 결과 필요 : key2의 값이 홍보 한 정규 경우

[ 
{"key1": 6 , "key2": "1 hour ago", "key3": 1} 
{"key1": 5 , "key2": "8 hours ago", "key3": 2} 
{"key1": 7 , "key2": "42 hours ago", "key3": 9} 
] 
+3

아니, 값은 문자열이며, 문자열은 사전 식 분류되어 있습니다. –

답변

8

수는 예외 처리가 포함 된 람다,보다는

undecorated.sort(key=lambda d: int(d['key2'].split()[0])) 
+0

'1 시간 전'과 '2 분 전'과 같은 값을 올바르게 정렬하지 않습니다. 이를 위해서는 [일반 구문 분석기] (https://stackoverflow.com/a/46713151/244297)를 사용해야합니다. –

+0

@EugeneYarmash 사실, 값이 일반 사항 인 경우 OP에는 더 다양한 예제가 포함되어야합니다. 이는 제시된 입력에 대해, 그리고 추가 패키지 없이도 작동합니다. 그리고 ** ** 이미 ** 인트로 문장에서 이러한 제약 조건을 만족시키는 나의 솔루션을 인정했습니다.) – schwobaseggl

0

비교 키가 조금 복잡하다에, 내가 선호 인해 그 기능하게, 그리고 더 많은 읽을 수 있습니다 : 여기 esented, 당신은 할 수

a = {"key1": 5, "key2": "8 hours ago", "key3": 2} 
b = {"key1": 7, "key2": "42 hours ago", "key3": 9} 
c = {"key1": 6, "key2": "1 hour ago", "key3": 1} 
undecorated = [a, b, c] 


def compare_key(my_dict): 
    value = my_dict.get('key2') 
    try: 
     result = int(value.split()[0]) 
    except: 
     result = 0 
    return result 


undecorated.sort(key=compare_key) 

print(undecorated) 
+1

베어드 제외는 정말 좋은 스타일이 아닙니다. 또한 처음에 실패를 두는 이유를 '0'을 사용하여 설명하는 것이 유용 할 수 있습니다. – MSeifert

+0

귀하의 권리는 여기에 데모 용이지만 예외는 더 구체적이어야하지만 여기서는 데모 용입니다. –

3

주석에 이미 설명 된대로 비교 키는 문자열이므로 사전 식으로 비교됩니다. 당신은 제대로 비교 datetime 객체에 문자열을 구문 분석 dateparser 모듈 (pip install dateparser)를 사용할 수 있습니다

>>> from dateparser import parse 
>>> undecorated.sort(key=lambda x: parse(x["key2"]), reverse=True) 
>>> undecorated 
[{'key1': 6, 'key2': '1 hour ago', 'key3': 1}, {'key1': 5, 'key2': '8 hours ago', 'key3': 2}, {'key1': 7, 'key2': '42 hours ago', 'key3': 9}] 
관련 문제