根据编号键对dict进行排序

时间:2018-01-31 22:19:18

标签: python sorting dictionary

我想基于具有类似“[0-9] + _ [A-Z] +”的模式的键对dict进行排序。我希望按升序排序。

这就是我现在所处的位置:

import operator
myDict = {
        '120_str' : 'value',
        '150_str' : 'value',
        '110_str' : 'value',
        '80_str' : 'value',
        '10_str' : 'value',
        '20_str' : 'value'
        }

sortedDict = sorted(myDict.items(), key=operator.itemgetter(0))

我实际拥有的东西:

sortedDict = {
        '10_str' : 'value',
        '110_str' : 'value',
        '120_str' : 'value',
        '150_str' : 'value',
        '20_str' : 'value',
        '80_str' : 'value'
        }

我想拥有什么:

sortedDict = {
        '10_str' : 'value',
        '20_str' : 'value',
        '80_str' : 'value',
        '110_str' : 'value',
        '120_str' : 'value',
        '150_str' : 'value'
        }

5 个答案:

答案 0 :(得分:3)

使用_分隔的第一个元素(int)作为排序键:

sorted(myDict.items(), key=lambda x: int(x[0].split('_')[0]))

使用collections.OrderedDict维护订购:

collections.OrderedDict(sorted(myDict.items(), key=lambda x: int(x[0].split('_')[0])))

示例:

In [109]: sorted(myDict.items(), key=lambda x: int(x[0].split('_')[0]))
Out[109]: 
[('10_str', 'value'),
 ('20_str', 'value'),
 ('80_str', 'value'),
 ('110_str', 'value'),
 ('120_str', 'value'),
 ('150_str', 'value')]

In [110]: collections.OrderedDict(sorted(myDict.items(), key=lambda x: int(x[0].split('_')[0])))
Out[110]: 
OrderedDict([('10_str', 'value'),
             ('20_str', 'value'),
             ('80_str', 'value'),
             ('110_str', 'value'),
             ('120_str', 'value'),
             ('150_str', 'value')])

答案 1 :(得分:3)

>>> def key(s):
...     n, s = s.split('_', 1)
...     return int(n), s
... 
>>> from collections import OrderedDict
>>> OrderedDict([(k, myDict[k]) for k in sorted(myDict, key=key)])
OrderedDict([('10_str', 'value'),
             ('20_str', 'value'),
             ('80_str', 'value'),
             ('110_str', 'value'),
             ('120_str', 'value'),
             ('150_str', 'value')])

答案 2 :(得分:2)

这是怎么回事?你可以从字符串中过滤数字,并根据它对字典进行排序。

要求您使用特定字符拆分。如果您的密钥结构发生变化,这仍然有用。

sorted(myDict.items(), key=lambda t: int(filter(str.isdigit, t[0])))

答案 3 :(得分:1)

你可以试试这个:

import re
sortedDict = {
    '10_str' : 'value',
    '110_str' : 'value',
    '120_str' : 'value',
    '150_str' : 'value',
    '20_str' : 'value',
    '80_str' : 'value'
    }

final_data = sorted(sortedDict.items(), key=lambda x:int(re.findall('^\d+', x[0])[0]))

输出:

[('10_str', 'value'), ('20_str', 'value'), ('80_str', 'value'), ('110_str', 'value'), ('120_str', 'value'), ('150_str', 'value')]

答案 4 :(得分:1)

这是一种方法,假设输出是元组列表。字典不被视为有序,但它们可能在将来。

转换为int后排序,然后添加字符串格式:

myLst = [(str(k)+'_str', v) for k, v in \
         sorted([(int(k.split('_')[0]), v) for k, v in myDict.items()])]

# [('10_str', 'value'),
#  ('20_str', 'value'),
#  ('80_str', 'value'),
#  ('110_str', 'value'),
#  ('120_str', 'value'),
#  ('150_str', 'value')]