dict = {'454133': 'PSJ', '420771': 'PSM', '403811': 'PSB', '434330': 'PSG',
'329745': 'PSG', '460192': 'PSC', '421534': 'PSA', '398614': 'PSM',
'398920': 'PSE', '403962': 'PSP', '331110': 'PSQ', '398436': 'PSP',
'306762': 'PSE', '403714': 'PSO', '460145': 'PSC', '398394': 'PST',
'451324': 'PSS', '255695': 'PSD', '237330': 'PSC', '398572': 'PSD',
'437653': 'PSR', '425822': 'PSI', '311786': 'PSS', '412713': 'PSK',
'460184': 'PSA', '328371': 'PSF', '344331': 'PSJ', '367531': 'PSR',
'109754': 'PS3', '404903': 'PSK', '402154': 'PSN', '399552': 'PSH',
'425861': 'PSL', '446234': 'PSF', '309296': 'PSO', '447616': 'PSH',
'151336': 'PSA', '306000': 'PSI', '404370': 'PSL', '103661': 'PS2',
'439822': 'PSN', '087265': 'PS1', '413635': 'PSB', '265040': 'PSQ',
'141005': 'PSB', '111111': 'PS10', '151515': 'PS20'}
我想按值对字典进行排序,并按顺序获取键列表。 值为[A-Z] +的键应显示在顶部,带[A-Z0-9] +值的键应显示在最后。
结果应为:
['141005', '151336', '237330', '255695', '265040', '306000', '306762', '309296',
'311786', '328371', '329745', '331110', '344331', '367531', '398394', '398436',
'398572', '398614', '398920', '399552', '402154', '403714', '403811', '403962',
'404370', '404903', '412713', '413635', '420771', '421534', '425822', '425861',
'434330', '437653', '439822', '446234', '447616', '451324', '454133', '460145',
'460184', '460192', '087265', '103661', '109754', '111111', '151515']
我已经尝试过以下操作,但它总是首先给出[A-Z0-9] +键,最后给出[A-Z] +键。
sorted_dict = sorted(dict.iteritems(), key=operator.itemgetter(1))
答案 0 :(得分:4)
sorted_dict = sorted(
dict.iteritems(),
key=lambda (_,value): tuple((not c.isalpha(), c) for c in value)
)
说明:通过以下方式比较字符:
然后得到最终结果,
map(operator.itemgetter(0), sorted_dict)
但不应该'421534', '460184', '151336'
(按某种顺序)先行?这些是值为'PSA'
的键。
编辑:你对你想要的排序顺序含糊不清(例如,首先从'AB12C'
和'AB2C'
开始出现哪种排序顺序?)。
然而,这是另一种可能性:
def parts(s):
parts = []
for part in re.split('(?=\\d)', s)
try:
parts.append(int(part))
except ValueError:
parts.append(part)
sorted_dict = sorted(dict.iteritmes(), key=lambda (_,value): parts(value)))
这会在'PS3'
之前将'PS20'
和'AB2C'
之前的'AB12C'
放在一起。
答案 1 :(得分:1)
我有一种方法可以提供你期望的结果。
我对d
使用dict
,因为它是更好的标识符。
s = sorted([c for c in d.keys() if d[c].isalpha()]) +
sorted([c for c in d.keys() if not d[c].isalpha()])
似乎这是直接根据您定义的规则构建的。
这会给s
:
['141005', '151336', '237330', '255695', '265040', '306000', '306762', '309296', '311786', '328371', '329745', '331110', '344331', '367531', '398394', '398436', '398572', '398614', '398920', '399552', '402154', '403714', '403811', '403962', '404370', '404903', '412713', '413635', '420771', '421534', '425822', '425861', '434330', '437653', '439822', '446234', '447616', '451324', '454133', '460145', '460184', '460192', '087265', '103661', '109754', '111111', '151515']