如何使用混合字母和数字键对Python中的字典进行排序?

时间:2017-03-12 12:34:09

标签: python sorting dictionary

我有这样的字典:

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中的键以数字方式排序的。 我找到了一些答案,用纯数字键排序键,但不是混合键,所以它们并没有真正帮助。

非常感谢。

此致

7 个答案:

答案 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]]])

https://docs.python.org/2/library/functions.html#sorted

答案 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])))

但我认为我以前的版本更具可读性。