【问题标题】:Dictionary sorting by key length字典按键长排序
【发布时间】:2012-07-30 00:36:14
【问题描述】:

有人知道如何按键长度对这个字典进行排序吗?

{
    'http://ccc.com/viewvc/' : [{'type': 'web-servers', 'app': 'Apache', 'ver': '2.2.14'}, {'type': 'operating-systems', 'app': 'Ubuntu', 'ver': None}],    
    'http://bbb.com/' : [{'type': 'web-servers', 'app': 'Apache', 'ver': '2.2.22'}, {'type': 'programming-languages', 'app': 'PHP', 'ver': '5.3.10'}, {'type': 'cms', 'app': 'Drupal', 'ver': None}, {'type': 'operating-systems', 'app': 'Ubuntu', 'ver': None}, {'type': 'javascript-frameworks', 'app': 'jQuery', 'ver': None}, {'type': 'captchas', 'app': 'Mollom', 'ver': None}]
}

预期输出:

{
    'http://bbb.com/' : [{'type': 'web-servers', 'app': 'Apache', 'ver': '2.2.22'}, {'type': 'programming-languages', 'app': 'PHP', 'ver': '5.3.10'}, {'type': 'cms', 'app': 'Drupal', 'ver': None}, {'type': 'operating-systems', 'app': 'Ubuntu', 'ver': None}, {'type': 'javascript-frameworks', 'app': 'jQuery', 'ver': None}, {'type': 'captchas', 'app': 'Mollom', 'ver': None}]
    'http://ccc.com/viewvc/' : [{'type': 'web-servers', 'app': 'Apache', 'ver': '2.2.14'}, {'type': 'operating-systems', 'app': 'Ubuntu', 'ver': None}],    

}

我使用的是 Python 2.6。

【问题讨论】:

  • 字典是无序的;你想只显示字典吗?按排序顺序循环键?请具体说明您的预期输出。
  • 我想按键长对字典进行排序...不是为了显示,而是为了在应用程序中进一步使用它
  • 字典无法排序。

标签: python sorting dictionary ordereddictionary


【解决方案1】:

Python v2.7+

>>> from collections import OrderedDict
>>> d = {
    'http://ccc.com/viewvc/' : [{'type': 'web-servers', 'app': 'Apache', 'ver': '2.2.14'}, {'type': 'operating-systems', 'app': 'Ubuntu', 'ver': None}],    
    'http://bbb.com/' : [{'type': 'web-servers', 'app': 'Apache', 'ver': '2.2.22'}, {'type': 'programming-languages', 'app': 'PHP', 'ver': '5.3.10'}, {'type': 'cms', 'app': 'Drupal', 'ver': None}, {'type': 'operating-systems', 'app': 'Ubuntu', 'ver': None}, {'type': 'javascript-frameworks', 'app': 'jQuery', 'ver': None}, {'type': 'captchas', 'app': 'Mollom', 'ver': None}]
}
>>> OrderedDict(sorted(d.iteritems(), key=lambda x: len(x[0])))
OrderedDict([('http://bbb.com/', [{'ver': '2.2.22', 'app': 'Apache', 'type': 'web-servers'}, {'ver': '5.3.10', 'app': 'PHP', 'type': 'programming-languages'}, {'ver': None, 'app': 'Drupal', 'type': 'cms'}, {'ver': None, 'app': 'Ubuntu', 'type': 'operating-systems'}, {'ver': None, 'app': 'jQuery', 'type': 'javascript-frameworks'}, {'ver': None, 'app': 'Mollom', 'type': 'captchas'}]), ('http://ccc.com/viewvc/', [{'ver': '2.2.14', 'app': 'Apache', 'type': 'web-servers'}, {'ver': None, 'app': 'Ubuntu', 'type': 'operating-systems'}])])

早期的 Python 版本

OrderedDict for older versions of python

【讨论】:

  • 我使用的是旧版本的python => 2.6
  • @badc0re 你可以搜索'OrderedDict recipe for Python 2.6'
【解决方案2】:
newlist = yourdict.items()
sortedlist = sorted(newlist, key=lambda s: len(s[0]))

会给你一个新的list 元组,它们按原始键的长度排序。

【讨论】:

  • 不,它不会...list.sort 是一个就地函数并返回None。将其更改为sorted(newlist, key=lambda s: len(s[0]))
  • newlist 中的所有元组长度为 2。您需要 key=lambda s: len(s[0])
  • 呃,我知道我有这样的原因是有原因的。一定是回家的时间!谢谢@DavidRobinson
猜你喜欢
  • 2021-11-27
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 2017-08-20
  • 2016-11-22
相关资源
最近更新 更多