在python中对字典的字母数字键进行排序

时间:2013-07-26 18:19:45

标签: python regex dictionary

我有一个python字典,其键具有以下模式

<some x number of digits/alphabets> <some y number of alphabets><some z number of digits>

我想根据这个键对字典进行排序。 例如

01IB0610, 01IB062, 01IB064

应为01IB062, 01IB064 01IB0610

完整的例子是这样的:

{ '01IB0610' : {'a' : [] , 'b': [] }, '01IB062' : {'a' : [] , 'b': [] } , '01IB064' : {'a' : [] , 'b': [] }

最终输出应为:{ '01IB062' : {'a' : [] , 'b': [] }, '01IB064' : {'a' : [] , 'b': [] } , '01IB0610' : {'a' : [] , 'b': [] }

2 个答案:

答案 0 :(得分:3)

import re

def key_func(s):
    return [int(x) if x.isdigit() else x for x in re.findall(r'\D+|\d+', s)]

sorted_keys = sorted(d, key=key_func)

示例:

>>> d = {'01IB0610': 'foo', '01IB062': 'bar', '01IB0604': 'baz'}
>>> sorted(d, key=key_func)
['01IB062', '01IB0604', '01IB0610']

答案 1 :(得分:0)

我不确定我是否完全符合排序标准,但您可以使用OrderedDict来保留特定顺序的dict

from collections import OrderedDict
import re
d = {'01IB0610': 1, '01IB062': 2, '01IB064': 3}

def criteria(x):
    number = int(re.sub('[^0-9]', '', x[0]) )
    length = len(x[0])
    return length, number
d = OrderedDict( sorted( d.items(), key = criteria ) )
d.keys()
>> ['01IB062', '01IB064', '01IB0610']

这会创建一个OrderedDict,其中原始dict中元素的顺序基于这些元素的键的分层排序。第一个标准是密钥的长度,即01IB061001IB064之后,因为它更长。第二个标准基于密钥中的数字,即0106201064之前。