按truple value date obj排序字典

2024-09-22 20:30:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的字典,我想按truple中的date对象对它进行排序

final_dict={'102 Not Out': "('75', '2018-05-04 00:00:00'),N/A",
'2.0': "('84', '2019-01-01 00:00:00'),8.5",
'3 Dev': "('0', '2018-05-11 00:00:00'),No IMDB Info Available",
'Adityam': "('34', '2018-04-27 00:00:00'),No IMDB Info Available",
'Ajay Devgn – Luv Ranjan’s Next': "('63', '2018-10-19 00:00:00'),No IMDB Info Available",
'Arjun Patiala': "('0', '2018-09-13 00:00:00'),No IMDB Info Available",
'Baazaar': "('60', '2018-05-01 00:00:00'),N/A"}

我有下面的代码,但它不工作-它只按键排序字典

OrderedDict(sorted(final_dict.items(), key=lambda t: t[0]))

OR

sorted(final_dict.items(),key=lambda x: x[1][2])

正在查找以下输出:

{'Adityam': "('34', '2018-04-27 00:00:00'),No IMDB Info Available",
'Baazaar': "('60', '2018-05-01 00:00:00'),N/A",
'102 Not Out': "('75', '2018-05-04 00:00:00'),N/A",
'3 Dev': "('0', '2018-05-11 00:00:00'),No IMDB Info Available",
'Arjun Patiala': "('0', '2018-09-13 00:00:00'),No IMDB Info Available",
'Ajay Devgn – Luv Ranjan’s Next': "('63', '2018-10-19 00:00:00'),No IMDB Info Available",
'2.0': "('84', '2019-01-01 00:00:00'),8.5",
}

有人能帮忙吗?你知道吗


Tags: nodevinfo字典排序notoutdict
3条回答

您可以使用ast.literal_eval

import ast
import collections
import re
final_dict={'102 Not Out': "('75', '2018-05-04 00:00:00'),N/A",'2.0': "('84', '2019-01-01 00:00:00'),8.5", '3 Dev': "('0', '2018-05-11 00:00:00'),No IMDB Info Available",'Adityam': "('34', '2018-04-27 00:00:00'),No IMDB Info Available",'Ajay Devgn – Luv Ranjan’s Next': "('63', '2018-10-19 00:00:00'),No IMDB Info Available", 'Arjun Patiala': "('0', '2018-09-13 00:00:00'),No IMDB Info Available",'Baazaar': "('60', '2018-05-01 00:00:00'),N/A"}
new_data = sorted(final_dict.items(), key=lambda x:list(map(int, ast.literal_eval(re.sub('(?<=\))[\w\W]+', '', x[-1]))[-1].split()[0].split('-'))))
final_data = collections.OrderedDict(new_data)

输出:

OrderedDict([('Adityam', "('34', '2018-04-27 00:00:00'),No IMDB Info Available"), 
('Baazaar', "('60', '2018-05-01 00:00:00'),N/A"), 
('102 Not Out', "('75', '2018-05-04 00:00:00'),N/A"), ('3 Dev', "('0', '2018-05-11 00:00:00'),No IMDB Info Available"), 
('Arjun Patiala', "('0', '2018-09-13 00:00:00'),No IMDB Info Available"), 
('Ajay Devgn \xe2\x80\x93 Luv Ranjan\xe2\x80\x99s Next', "('63', '2018-10-19 00:00:00'),No IMDB Info Available"), 
('2.0', "('84', '2019-01-01 00:00:00'),8.5")])

我建议您使用datetime模块,只需在一行中使用简洁的解决方案:

import datetime

print(sorted(final_dict.items(),key=lambda x:datetime.datetime.strptime(x[1].split()[1].replace("'",''),'%Y-%m-%d')))

输出:

[('Adityam', "('34', '2018-04-27 00:00:00'),No IMDB Info Available"), ('Baazaar', "('60', '2018-05-01 00:00:00'),N/A"), ('102 Not Out', "('75', '2018-05-04 00:00:00'),N/A"), ('3 Dev', "('0', '2018-05-11 00:00:00'),No IMDB Info Available"), ('Arjun Patiala', "('0', '2018-09-13 00:00:00'),No IMDB Info Available"), ('Ajay Devgn – Luv Ranjan’s Next', "('63', '2018-10-19 00:00:00'),No IMDB Info Available"), ('2.0', "('84', '2019-01-01 00:00:00'),8.5")]

这是使用collections.OrderedDictast.literal_eval的一种方法。你知道吗

如前所述,如果可能的话,最好在数据到达字典之前解决这些问题。你知道吗

from collections import OrderedDict
from ast import literal_eval

res = OrderedDict(sorted(final_dict.items(),
                  key=lambda x: literal_eval(x[1].split('),')[0]+')')[1]))

结果:

OrderedDict([('Adityam', "('34', '2018-04-27 00:00:00'),No IMDB Info Available"),
             ('Baazaar', "('60', '2018-05-01 00:00:00'),N/A"),
             ('102 Not Out', "('75', '2018-05-04 00:00:00'),N/A"),
             ('3 Dev', "('0', '2018-05-11 00:00:00'),No IMDB Info Available"),
             ('Arjun Patiala', "('0', '2018-09-13 00:00:00'),No IMDB Info Available"),
             ('Ajay Devgn – Luv Ranjan’s Next', "('63', '2018-10-19 00:00:00'),No IMDB Info Available"),
             ('2.0', "('84', '2019-01-01 00:00:00'),8.5")])

相关问题 更多 >