我想基于具有类似“[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'
}
答案 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')]