我有这样的字典:
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中的键以数字方式排序的。 我找到了一些答案,用纯数字键排序键,但不是混合键,所以它们并没有真正帮助。
非常感谢。
此致
答案 0 :(得分:1)
你可以从你的词典中得到排序的词典:
from collections import OrderedDict
OrderedDict(sorted(dict_str.items(), key=lambda s: int(s[0].split('_')[1])))
答案 1 :(得分: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')]
答案 2 :(得分:1)
另一个解决方案。执行已排序的函数时,它将返回字典中所有键的排序列表。无法对字典进行排序(尽管有一种方法可以使用ordered dictionary)。
与第一种解决方案相比,此解决方案也更加强大,因为密钥可以位于密钥的任何位置。
import re
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)
print sorted(keys, key=lambda key: sort_mixed(key))
答案 3 :(得分:1)
你应该看看natsort。有一些方法可以自己完成,无需导入额外的模块,但我喜欢方法。
FusedLocation
答案 4 :(得分:0)
你不能通过定义dict是什么来对dict本身进行排序。 但您可以通过传递所需的键来按任何自定义顺序对其键进行排序。参数排序函数
排序(iterable [,cmp [,key [,reverse]]])
答案 5 :(得分:0)
您可以使用附加键 - 参数:
将字典的键排序到列表中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]))
答案 6 :(得分:0)
这是使用我在评论中提到的切片技术的解决方案。这不如使用.split
那么健壮,因为前缀的长度为&amp;后缀字符串是硬编码的,但它稍快一些,因为与方法调用相比,切片速度很快。
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])))
但我认为我以前的版本更具可读性。