我有一个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': [] }
答案 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
中元素的顺序基于这些元素的键的分层排序。第一个标准是密钥的长度,即01IB0610
在01IB064
之后,因为它更长。第二个标准基于密钥中的数字,即01062
在01064
之前。