我有一个名为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.OrderedDict(sorted(data.items()))
这是以
为结果ind1 : {}
ind11 : {}
ind12 : {}
ind13 : {}
.....
ind20 : {}
ind21 : {}
....
ind3 : {}
ind4 : {}
....
请帮忙
答案 0 :(得分:1)
你需要让钥匙以“ind”为前缀吗?您可以使用整数作为正确排序的键。现在它按字母顺序排序,导致问题。
如果您不能,假设您的密钥遵循相同的格式,请使用以下方式排序:
collections.OrderedDict(sorted(data.items(), key=lambda kv: int(kv[0][3:])))
使用前缀后的整数进行排序。
答案 1 :(得分:0)
您真的想要对词典中的数据进行排序,还是只想对.keys()提供的列表进行排序?
如果您只对值列表进行排序,则此链接应包含您需要的内容:https://wiki.python.org/moin/HowTo/Sorting
如果您希望对字典中的数据进行排序,我很想知道原因。我会在您回复时关注并添加建议。
祝你好运!答案 2 :(得分:0)
如果你想要" ind10"你需要在你的键上使用自然排序算法。追随" ind9" ; ^)
上的 wizkiddef keynat(string):
r'''A natural sort helper function for sort() and sorted()
without using regular expression.
>>> items = ('Z', 'a', '10', '1', '9')
>>> sorted(items)
['1', '10', '9', 'Z', 'a']
>>> sorted(items, key=keynat)
['1', '9', '10', 'Z', 'a']
'''
r = []
for c in string:
if c.isdigit():
if r and isinstance(r[-1], int):
r[-1] = r[-1] * 10 + int(c)
else:
r.append(int(c))
else:
r.append(c)
return r
data = collections.OrderedDict(
sorted(
data.iteritems(),
key=lambda row:keynat(row[0])
)
)
答案 3 :(得分:0)
如果您不希望每个密钥都以'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': {}}