如何根据字典的键进行排序?
示例输入:
{2:3, 1:89, 4:5, 3:0}
期望的输出:
{1:89, 2:3, 3:0, 4:5}
如何根据字典的键进行排序?
示例输入:
{2:3, 1:89, 4:5, 3:0}
期望的输出:
{1:89, 2:3, 3:0, 4:5}
注意: 对于Python 3.7+,请参见此答案
标准的Python字典是无序的(在Python 3.7之前)。即使您对(键,值)对进行了排序,也无法以保留排序方式的方式将它们存储在dict
中。
最简单的方法是使用OrderedDict
,它可以记住元素插入的顺序:
In [1]: import collections
In [2]: d = {2:3, 1:89, 4:5, 3:0}
In [3]: od = collections.OrderedDict(sorted(d.items()))
In [4]: od
Out[4]: OrderedDict([(1, 89), (2, 3), (3, 0), (4, 5)])
不用在意od
的输出方式;它会按预期运行:
In [11]: od[1]
Out[11]: 89
In [12]: od[3]
Out[12]: 0
In [13]: for k, v in od.iteritems(): print k, v
....:
1 89
2 3
3 0
4 5
对于Python 3用户,需要使用.items()
代替.iteritems()
:
In [13]: for k, v in od.items(): print(k, v)
....:
1 89
2 3
3 0
4 5
sorted_dict = dict(sorted(unsorted_dict.items()))
可以将未排序的字典转换为已排序的字典。 - aksh1618对于CPython/PyPy 3.6,以及任何Python 3.7或更高版本,可以轻松完成以下操作:
>>> d = {2:3, 1:89, 4:5, 3:0}
>>> dict(sorted(d.items()))
{1: 89, 2: 3, 3: 0, 4: 5}
{key: d[key] for key in sorted(d.keys())}
- flow2k{}
将sorted
括起来,例如{sorted(d.items())}
,以使它更短。那只会尝试创建一个集合。 - ChaimG{key:d[key] for key in sorted(d)}
,
因为sorted(d)返回了一个按键排序后的列表。 - Julian - BrainAnnex.orgsorted(d.items())
而无需使用dict()
。 - Timosorted(d.items())
返回的是已排序的键值对可迭代对象,而不是字典。 - Dipu词典本身并没有顺序,如果您想要按照某种顺序打印它们,以下是一些示例:
在Python 2.4及以上版本中:
mydict = {'carl':40,
'alan':2,
'bob':1,
'danny':3}
for key in sorted(mydict):
print "%s: %s" % (key, mydict[key])
提供:
alan: 2
bob: 1
carl: 40
danny: 3
(Python 版本低于 2.4:)
keylist = mydict.keys()
keylist.sort()
for key in keylist:
print "%s: %s" % (key, mydict[key])
来源: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/
for key, value in sorted(mydict.items())"
- beep_check>>> from collections import OrderedDict
>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}
>>> # dictionary sorted by key -- OrderedDict(sorted(d.items()) also works
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
reverse=True
,例如OrderedDict(sorted(d.items(), reverse=True, key=lambda t: t[0]))
。 - benscabbiaUnexpected type(s): (List[str]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])
。 - Euler_Salter有许多Python模块提供字典实现,可以自动维护键的排序顺序。考虑使用纯Python且速度快如C语言实现的 sortedcontainers 模块。此外,还有一个性能比较,将其与其他流行选项进行了基准测试。
如果您需要不断添加和删除键/值对并进行迭代,则使用有序字典是不够的解决方案。
>>> from sortedcontainers import SortedDict
>>> d = {2:3, 1:89, 4:5, 3:0}
>>> s = SortedDict(d)
>>> s.items()
[(1, 89), (2, 3), (3, 0), (4, 5)]
SortedDict类型还支持基于索引的位置查找和删除,这是使用内置的dict类型无法实现的。
>>> s.iloc[-1]
4
>>> del s.iloc[2]
>>> s.keys()
SortedSet([1, 2, 4])
简单来说:
d = {2:3, 1:89, 4:5, 3:0}
sd = sorted(d.items())
for k,v in sd:
print k, v
输出:
1 89
2 3
3 0
4 5
sd
是一个元组列表,而不是字典。(但仍然很有用。) - nischiprint k, v
可以正常工作,因为print
是一个关键字而不是函数。 - Alan BagelPython 3.6之前的Python字典是无序的。在Python 3.6的CPython实现中,字典保持插入顺序。从Python 3.7开始,这将成为一种语言特性。
在Python 3.6的变更日志中(https://docs.python.org/3.6/whatsnew/3.6.html#whatsnew36-compactdict):
这个新实现中保留顺序的方面被认为是一个实现细节,不应该依赖它(这可能会在未来改变,但希望在将语言规范强制要求保留顺序的语义之前,在语言中使用这个新的字典实现几个版本;这也有助于保持向后兼容性,以便与仍然存在随机迭代顺序的旧版本的语言(例如Python 3.5)兼容)。
在Python 3.7的文档中(https://docs.python.org/3.7/tutorial/datastructures.html#dictionaries):
在字典上执行list(d)会返回一个列表,其中包含字典中使用的所有键,按插入顺序排序(如果要进行排序,只需使用sorted(d)即可)。test_dict = {'a': 1, 'c': 3, 'b': {'b2': 2, 'b1': 1}}
def dict_reorder(item):
return {k: dict_reorder(v) if isinstance(v, dict) else v for k, v in sorted(item.items())}
reordered_dict = dict_reorder(test_dict)
https://gist.github.com/ligyxy/f60f0374defc383aa098d44cfbd318eb
sort_dict()
,可能应该改为 dict_reorder()
。 - drs找到另一种方法:
import json
print json.dumps(d, sort_keys = True)
更新:
1. 这个方法也可以对嵌套对象进行排序(感谢@DanielF)。
2. Python 字典是无序的,因此只适用于打印或分配字符串的情况。
正如其他人所提到的,字典本质上是无序的。然而,如果问题只是要以有序的方式显示字典,您可以在字典子类中覆盖__str__
方法,并使用这个字典类而不是内置的dict
。例如:
class SortedDisplayDict(dict):
def __str__(self):
return "{" + ", ".join("%r: %r" % (key, self[key]) for key in sorted(self)) + "}"
>>> d = SortedDisplayDict({2:3, 1:89, 4:5, 3:0})
>>> d
{1: 89, 2: 3, 3: 0, 4: 5}
请注意,这不会改变键的存储方式,它们在迭代时返回的顺序等等,只是改变它们在print
或Python控制台上的显示方式。
这里已经有很多答案展示了流行的Python字典排序方式。我想为那些从Google来到这里寻找非标准想法的人添加一些不太明显的方法。
示例字典:d = {2: 'c', 1: 'b', 0: 'a', 3: 'd'}
# Converts to list, sorts, re-converts to dict
{k: v for k, v in sorted(list(d.items()))}
排序并不总是按照严格的升序或降序排序。为了进行更有条件的排序,可以结合上述方法使用lambda表达式:
{k: v for k, v in sorted(d.items(), key=lambda v: ord(v[1]))}
这个主题已经有足够多的好例子了。如果需要更多的示例,以及边缘情况和怪异情况,请查看此文章,了解如何在Python中对字典进行排序。
sorted(list(d))
替换为 sorted(d.items())
(在 Python 3.8 上)。 - lhoupert.items()
调用。 - alphazwest.items()
,感谢@ihoupert。 - Kofi
TreeMap
(https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html),它的行为完全符合OP的要求。 - Nayuki