如何使用字母和数字混合键对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中被弃用。你是说钥匙吗?