如何在python中按键对字典排序
我有一个名为data的python字典,里面有子字典,比如如何在python中按键对字典排序,python,python-2.7,sorting,dictionary,Python,Python 2.7,Sorting,Dictionary,我有一个名为data的python字典,里面有子字典,比如 data = {'ind1' : {}, 'ind10' : {}, 'ind11' : {}, 'ind12' : {}, 'ind13', 'ind14' : {}, 'ind15' : {}, 'ind16' : {}, 'ind17' : {}, 'ind18' : {}, 'ind19' : {}, 'ind2' : {}, 'ind20' : {}, 'ind3' : {}, 'ind30' : : {}, 'ind31'
data = {'ind1' : {}, 'ind10' : {}, 'ind11' : {}, 'ind12' : {}, 'ind13', 'ind14' : {}, 'ind15' : {}, 'ind16' : {}, 'ind17' : {}, 'ind18' : {}, 'ind19' : {}, 'ind2' : {}, 'ind20' : {}, 'ind3' : {}, 'ind30' : : {}, 'ind31' : {} 'ind5' : {}, 'ind6' : {}, 'ind7' : {}, 'ind8' : {}, 'ind9' : {}}
我想按键对字典中的数据进行排序
ind1
ind2 : {}
ind3 : {}
...
ind10 : {}
ind11 : {}
我试着从集合库中选择了data=collections.orderedict(sorted(data.items())
这是一个结果
ind1 : {}
ind11 : {}
ind12 : {}
ind13 : {}
.....
ind20 : {}
ind21 : {}
....
ind3 : {}
ind4 : {}
....
请提供帮助您需要在密钥前加上“ind”前缀吗?可以使用整数作为正确排序的键。现在是按字母顺序排序导致了这个问题 如果不能,假设您的密钥采用相同的格式,请使用以下方法进行排序:
collections.OrderedDict(sorted(data.items(), key=lambda kv: int(kv[0][3:])))
它使用前缀后的整数进行排序。是否确实要对字典中的数据进行排序,还是只对.keys()提供的列表进行排序 如果只对值列表进行排序,则此链接应包含所需内容: 如果您希望对字典中的数据进行排序,我很想知道原因。我将按照您的回答并添加建议
祝你好运 如果您希望“ind10”在“ind9”之后,则需要对键使用自然排序算法;^) 从wizkid开始
如果您不需要每个键都以
'ind'
开头,那么它们都可以是int
,这将按预期工作
如果它们确实需要是以'ind'
开头的字符串,则可以执行以下操作:
from __future__ import print_function
import pprint
from collections import OrderedDict
def ind_sort_key(item):
item_key, item_value = item
return int(item_key[3:])
data = {
'ind1': {}, 'ind10': {}, 'ind11': {}, 'ind12': {}, 'ind13': {},
'ind14': {}, 'ind15': {}, 'ind16': {}, 'ind17': {}, 'ind18': {},
'ind19': {}, 'ind2': {}, 'ind20': {}, 'ind3': {}, 'ind30': {},
'ind31': {}, 'ind5': {}, 'ind6': {}, 'ind7': {}, 'ind8': {}, 'ind9': {},
}
sorted_data = OrderedDict(sorted(data.items(), key=ind_sort_key))
pprint.pprint(sorted_data)
这导致:
{'ind1': {},
'ind2': {},
'ind3': {},
'ind5': {},
'ind6': {},
'ind7': {},
'ind8': {},
'ind9': {},
'ind10': {},
'ind11': {},
'ind12': {},
'ind13': {},
'ind14': {},
'ind15': {},
'ind16': {},
'ind17': {},
'ind18': {},
'ind19': {},
'ind20': {},
'ind30': {},
'ind31': {}}
你想先找到你的钥匙…为什么要按钥匙对字典排序?也许这并不是您真正需要做的事情。使用
orderedict
可能不是一个好主意,orderedict
s中的键是按插入顺序排序的,而不是其他。现在,如果您插入了ind1
和ind3
并对其进行了良好的排序,您就不能再插入ind2
并期望它的顺序良好了。谢谢,**natsort**做得最好,因为它按字母顺序进行排序,而且很自然,没有键是一些文件名,可能还有另一个前缀是foo1,bar2。。。或者只有foo、bar等。此代码根据您的问题很好地工作。您可能更喜欢通过解释一些具体情况来编辑您的问题。@KangkonSaikia,您应该在示例中始终使用真实数据(或尽可能接近真实数据:)。如果密钥将是文件名,那么要么使用那些精确的文件名,要么至少使用代表真实数据中各种类型的文件名。
{'ind1': {},
'ind2': {},
'ind3': {},
'ind5': {},
'ind6': {},
'ind7': {},
'ind8': {},
'ind9': {},
'ind10': {},
'ind11': {},
'ind12': {},
'ind13': {},
'ind14': {},
'ind15': {},
'ind16': {},
'ind17': {},
'ind18': {},
'ind19': {},
'ind20': {},
'ind30': {},
'ind31': {}}