按值排序dict并返回dict,而不是元组列表

时间:2012-02-27 05:25:39

标签: python list dictionary

  

可能重复:
  Python: Sort a dictionary by value

d = {"a":4, "b":12, "c":2}

如果我使用sorted()和lambda:

s = sorted(d.items(), key=lambda(k,v):(v,k))

我得到一个列表元组(键,值) 但是我又想要一个字谜:

{"c":2, "a":4, "b":12}

正在做dict(the_list_of_tuples)你回到原点。

3 个答案:

答案 0 :(得分:10)

标准dict对象未排序,因此不保证或保留任何排序。这是因为你通常使用dict得到一个键排序的值是不重要的。

如果您想保留订购,可以使用an OrderedDict。这没有排序,但确实记住了项目添加到它的顺序。因此,您可以按排序顺序使用键值对创建一个:

>>> d = {"a":4, "b":12, "c":2}
>>> from collections import OrderedDict
>>> od = OrderedDict(sorted(d.items(), key=lambda(k,v):(v,k)))
>>> od
OrderedDict([('c', 2), ('a', 4), ('b', 12)])

答案 1 :(得分:1)

这是不可能的。你只能得到一个你正在获得的字典的有序表示。


修改

刚做了一些研究。看起来Python 2.7有一个名为OrderedDict的东西,它允许你这样做。以下是有关它的更多信息:http://docs.python.org/library/collections.html?highlight=ordereddict#ordereddict-examples-and-recipes

答案 2 :(得分:1)

正如许多其他人指出的那样你不能因为python不允许你这样做(除了有序的dicts)。 无论如何你可以实现的是(python< 2.7)

>>> d = {"a":4, "b":12, "c":2}
>>> z = [(i,d[i]) for i in d]
>>> z.sort(key=lambda x: x[1])
>>> z
[('c', 2), ('a', 4), ('b', 12)]

现在d已排序,您可以对其执行二进制搜索以获得您想要的内容(如果您不太关心速度,则可以进行正常迭代)。