如何在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的python字典,里面有子字典,比如

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': {}}