如何在python中按键对字典进行排序

时间:2015-08-11 06:36:55

标签: 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' : {} 'ind5' : {}, 'ind6' : {}, 'ind7' : {}, 'ind8' : {}, 'ind9' : {}}

我想按键将字典中的数据排序为

ind1
ind2 : {}
ind3 : {}
...
ind10 : {}
ind11 : {}

我在集合库中尝试了data = collections.OrderedDict(sorted(data.items()))

这是以

为结果
ind1 : {}
ind11 : {}
ind12 : {}
ind13 : {}
.....
ind20 : {}
ind21 : {}
....
ind3 : {}
ind4 : {}
....

请帮忙

4 个答案:

答案 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" ; ^)

来自ActiveState

上的 wizkid
def 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': {}}