[英]How to sort a dictionary in Python with keys of mixed letters and numbers?
我有一本这样的字典:
dict_str = {'Number_1_item':'foo',
'Number_11_item':'bar',
'Number_22_item':'foobar',
'Number_5_item':'barfoo'}
我想要的输出是:
sorted_dict_str = {'Number_1_item':'foo',
'Number_5_item':'bar',
'Number_11_item':'foobar',
'Number_22_item':'barfoo'}
因此,sorted_dict_str基于dict_str中的键以数字方式排序。 我找到了一些答案,可以用纯数字键而不是混合数字键对键进行排序,因此它们并没有真正的帮助。
非常感谢。
问候
另一个解决方案。 执行排序函数时,它将返回字典中所有键的排序列表。 字典无法排序(尽管有一种有序字典的方式 )。
与第一个解决方案相比,该解决方案也更健壮,因为数字可以在密钥中的任何位置。
import re
from collections import OrderedDict
d = {'Number_1_item':'foo',
'Number_11_item':'bar',
'Number_22_item':'foobar',
'Number_5_item':'barfoo'}
keys = d.keys()
def sort_mixed(key):
int_match = re.search(r'(?P<int>\d+)', key)
number = int_match.group(0)
return int(number)
sorted_keys = sorted(keys, key=lambda key: sort_mixed(key))
print(sorted_keys) # print sorted keys
sorted_dict = OrderedDict((k, d[k]) for k in sorted_keys)
print(sorted_dict) # print new sorted dict
您可以像这样从字典中获得排序的字典:
from collections import OrderedDict
OrderedDict(sorted(dict_str.items(), key=lambda s: int(s[0].split('_')[1])))
如果我们假设所有键的格式都为Number_XX_item
,则可以使用lambda对数字部分进行排序:
sorted_dict_str = sorted(dict_str.items(), key=lambda x: int(x[0].split('_')[1]))
这给出以下输出:
sorted_dict_str =
[('Number_1_item', 'foo'),
('Number_5_item', 'barfoo'),
('Number_11_item', 'bar'),
('Number_22_item', 'foobar')]
您应该检查一下natsort 。 有很多方法可以自己完成,而无需导入额外的模块,但是我喜欢方法。
>>> from collections import OrderedDict
>>> import natsort
>>> input_dict = {'Number_1_item':'foo', 'Number_11_item':'bar', 'Number_22_item':'foobar', 'Number_5_item':'barfoo'}
>>> OrderedDict(natsort.natsorted(input_dict.items()))
OrderedDict([('Number_1_item', 'foo'), ('Number_5_item', 'barfoo'), ('Number_11_item', 'bar'), ('Number_22_item', 'foobar')])
这是使用我在评论中提到的切片技术的解决方案。 与使用.split
,此方法不那么健壮,因为前缀和后缀字符串的长度是硬编码的,但由于与方法调用相比,切片速度更快,因此速度稍快。
from collections import OrderedDict
from pprint import pprint
dict_str = {
'Number_1_item':'foo',
'Number_11_item':'bar',
'Number_22_item':'foobar',
'Number_5_item':'barfoo',
}
skeys = sorted(dict_str.keys(), key=lambda s: int(s[7:][:-5]))
sorted_dict = OrderedDict((k, dict_str[k]) for k in skeys)
pprint(sorted_dict)
输出
OrderedDict([('Number_1_item', 'foo'),
('Number_5_item', 'barfoo'),
('Number_11_item', 'bar'),
('Number_22_item', 'foobar')])
您还可以在OrderedDict
构造函数调用内的(键,值)对上进行排序:
sorted_dict = OrderedDict(sorted(dict_str.items(), key=lambda u: int(u[0][7:][:-5])))
但我认为以前的版本更具可读性。
您无法根据字典的定义对字典本身进行排序。 但是您可以通过将所需的'key'参数传递给已排序的函数来按任何自定义顺序对其键进行排序
排序(iterable [,cmp [,key [,反向]]])
您可以将字典的键与其他键参数一起排序到列表中:
dict_str = {'Number_1_item':'foo',
'Number_11_item':'bar',
'Number_22_item':'foobar',
'Number_5_item':'barfoo'}
sorted_keys = sorted(dict_str, key=lambda x: int(x.split('_')[1]))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.