繁体   English   中英

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

[英]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 [,反向]]])

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

您可以将字典的键与其他键参数一起排序到列表中:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM