2017-10-12 79 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} 
] 

,但結果需要:

[ 
{"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

如果key2值是公關定期這裏esented,你可以這樣做:

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

這不會像「1小時前」和「2分鐘前」那樣對值進行正確排序。爲此,您需要[使用通用分析器](https://stackoverflow.com/a/46713151/244297)。 –

+0

@EugeneYarmash確實如此,但如果這些值是通用的,那麼OP應該包含更多的例子。這適用於呈現的輸入,並且不需要額外的包。我**已經合格**我的解決方案與介紹句子中的這些限制;) – schwobaseggl

0

由於比較關鍵的是有點複雜,我寧願讓它的功能,而不是一個lambda,它可以包含嘗試 - 除了,更可讀:

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

正如在評論中已經解釋的那樣,由於你的比較鍵是字符串,所以它們按字典順序進行比較。您可以使用dateparser模塊(pip install dateparser)的字符串解析到datetime對象,其比較恰當:

>>> 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}] 
相關問題