通过带有数字表示的键来订购字典

时间:2019-01-27 14:13:11

标签: python python-2.7 dictionary

我有此输入,每个值的范围为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

2 个答案:

答案 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