2017-10-12 80 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}] 
相关问题