使用python使用字母数字值对dictionary中的值进行排序

2024-05-13 14:03:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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))

Tags: dictpscpsepsdpsmpsjpsppsi
2条回答

我有一个方法可以给你预期的结果。你知道吗

我使用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']
sorted_dict = sorted(
    dict.iteritems(),
    key=lambda (_,value): tuple((not c.isalpha(), c) for c in value)
)

说明:比较字符的方法是:

  1. 字符是否按字母顺序排列,字母顺序优先。你知道吗
  2. 默认的词典比较

为了得到最终结果

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'之前。你知道吗

相关问题 更多 >