Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用字母和数字混合键对Python中的词典进行排序?_Python_Sorting_Dictionary - Fatal编程技术网

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

如何使用字母和数字混合键对Python中的词典进行排序?,python,sorting,dictionary,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',

我有一本这样的字典:

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'}
因此,排序的dict str是基于dict str中的键以数字方式排序的。 我找到了一些答案,可以用纯数字键(而不是混合键)对键进行排序,因此它们并没有真正的帮助

非常感谢


关于

您不能根据dict的定义对dict本身进行排序。 但您可以通过将所需的“key”参数传递到排序函数中,以任何自定义顺序对其键进行排序

可分类[,cmp[,键[,反转]]


你不能根据dict的定义对dict本身进行排序。 但您可以通过将所需的“key”参数传递到排序函数中,以任何自定义顺序对其键进行排序

可分类[,cmp[,键[,反转]]


您可以使用附加的键参数将字典的键排序到列表中:

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

您可以使用附加的键参数将字典的键排序到列表中:

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

您可以从您的dict中获得分类dict,如下所示:

from collections import OrderedDict

OrderedDict(sorted(dict_str.items(), key=lambda s: int(s[0].split('_')[1])))

您可以从您的dict中获得分类dict,如下所示:

from collections import OrderedDict

OrderedDict(sorted(dict_str.items(), key=lambda s: int(s[0].split('_')[1])))

如果我们可以假设所有键都在格式编号_XX _项上,则可以使用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')]

如果我们可以假设所有键都在格式编号_XX _项上,则可以使用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')]

另一个解决方案。当执行排序函数时,它将返回字典中所有键的排序列表。尽管有一种方法可以使字典分类,但它不能被分类

与第一个解决方案相比,此解决方案也更健壮,因为数字可以在密钥中的任何位置

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

另一个解决方案。当执行排序函数时,它将返回字典中所有键的排序列表。尽管有一种方法可以使字典分类,但它不能被分类

与第一个解决方案相比,此解决方案也更健壮,因为数字可以在密钥中的任何位置

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
>>> 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')])
你应该退房。有很多方法可以自己完成,不需要导入额外的模块,但我喜欢这种方法

>>> 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构造函数调用中对键、值对进行排序:

sorted_dict = OrderedDict(sorted(dict_str.items(), key=lambda u: int(u[0][7:][:-5])))

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

这里有一个使用我在评论中提到的切片技术的解决方案。由于前缀和后缀字符串的长度是硬编码的,因此这不如使用.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构造函数调用中对键、值对进行排序:

sorted_dict = OrderedDict(sorted(dict_str.items(), key=lambda u: int(u[0][7:][:-5])))

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

FWIW,Python中的普通dict是一个无序的集合。collections模块中有OrderedDict,它通过使用内部列表来记住插入顺序来保留插入顺序,而在CPython 3.6+中,普通dict记住插入顺序,但这是目前不应依赖的一个实现细节。您需要创建一个键函数来解析键中的数字组件并将其转换为int。如果您的键与问题中所示的键类似,则可以使用2个字符串切片操作来解析。FWIW,Python中的普通dict是一个无序的集合。collections模块中有OrderedDict,它通过使用内部列表来记住插入顺序来保留插入顺序,而在CPython 3.6+中,普通dict记住插入顺序,但这是目前不应该依赖的一个实现细节。您需要创建一个键函数来解析键中的数字组件并将其转换为int。如果您的键与问题中所示的键类似,则可以使用2个字符串切片操作来进行解析。在Python 3中,cmp效率低下且不受欢迎。你的意思是键吗?cmp效率很低,在Python 3中被弃用。你是说钥匙吗?