我有此输入,每个值的范围为200:
d = {'600-800': 3, '1800-2000': 3, '1000-1200': 5, '400-600': 1, '2600-2800': 1}
我正在寻找这个预期的订单:
{'400-600': 1, '600-800': 3, '1000-1200': 5, '1800-2000': 3, '2600-2800': 1}
已经尝试过类似的操作,但是顺序是错误的:
import collections
od = collections.OrderedDict(sorted(d.items()))
print od
答案 0 :(得分:4)
您可以在'-'
处将键拆分为多个部分,并将第一部分用作整数值对其进行排序。由于键值的性质(当转换为整数时),第二部分与排序无关:
d = {'600-800': 3, '1800-2000': 3, '1000-1200': 5, '400-600': 1, '2600-2800': 1}
import collections
od = collections.OrderedDict(sorted(d.items(),key =lambda x: int(x[0].split("-")[0])))
print od
输出:
OrderedDict([('400-600', 1), ('600-800', 3), ('1000-1200', 5),
('1800-2000', 3), ('2600-2800', 1)])
Doku:
相关:
答案 1 :(得分:2)
如果要在第一年(如果需要的话再到第二年)订购字典,在给定的示例中这是不必要的,但感觉更自然),则需要转换为整数并设置自定义键:
d = {'600-800': 3, '1800-2000': 3, '1000-1200': 5, '400-600': 1, '2600-2800': 1}
sorted(d.items(), key=lambda t: tuple(map(int, t[0].split("-"))))
# [('400-600', 1),
# ('600-800', 3),
# ('1000-1200', 5),
# ('1800-2000', 3),
# ('2600-2800', 1)]
由于例如"1000" < "200"
,但1000 > 200
。以后,如需要,可以像在代码中一样将此列表传递给OrderedDict
。