如何按值对字典进行排序?

时间:2009-03-05 00:49:05

标签: python sorting dictionary

我有一个从数据库中的两个字段读取的值字典:字符串字段和数字字段。字符串字段是唯一的,因此这是字典的关键字。

我可以对键进行排序,但是如何根据值进行排序?

注意:我已经在 How do I sort a list of dictionaries by a value of the dictionary? 中阅读了Stack Overflow问题,可能会将我的代码更改为包含字典列表,但由于我不需要一个我想要的字典列表知道是否有一个更简单的解决方案,可以按升序或降序排序。

34 个答案:

答案 0 :(得分:4136)

无法对字典进行排序,只能获取已排序字典的表示形式。字典本质上是无序的,但其他类型(如列表和元组)则不是。所以你需要一个有序的数据类型来表示排序的值,它将是一个列表 - 可能是一个元组列表。

例如,

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(1))

sorted_x将是按元组中第二个元素排序的元组列表。 dict(sorted_x) == x

对于那些希望按键而不是值进行排序的人:

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(0))

在Python3中,由于不允许解包[1],我们可以使用

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=lambda kv: kv[1])

如果您希望输出为dict,可以使用collections.OrderedDict

import collections

sorted_dict = collections.OrderedDict(sorted_x)

答案 1 :(得分:1088)

简单如下:sorted(dict1, key=dict1.get)

嗯,实际上可以进行“按字典值排序”。最近我必须在代码高尔夫(Stack Overflow问题 Code golf: Word frequency chart )中这样做。最简单的问题是这样的:给定一个文本,计算每个单词遇到的频率,并显示顶部单词列表,按频率降低排序。

如果您构造一个字典,其中单词为键,每个单词的出现次数为值,则简化为:

from collections import defaultdict
d = defaultdict(int)
for w in text.split():
  d[w] += 1

然后你可以得到一个单词列表,按照sorted(d, key=d.get)的使用频率排序 - 排序迭代字典键,使用单词出现次数作为排序键。

for w in sorted(d, key=d.get, reverse=True):
  print w, d[w]

我正在写这个详细的解释,以说明人们通常所说的“我可以轻松地按键排序字典,但我如何按价值排序” - 我认为OP试图解决这个问题。解决方案是根据值对键进行排序,如上所示。

答案 2 :(得分:688)

您可以使用:

sorted(d.items(), key=lambda x: x[1])

这将根据字典中从最小到最大的每个条目的值对字典进行排序。

要按降序对其进行排序,只需添加reverse=True

sorted(d.items(), key=lambda x: x[1], reverse=True)

答案 3 :(得分:196)

无法对Dicts进行排序,但您可以从中构建排序列表。

dict值的排序列表:

sorted(d.values())

(键,值)对的列表,按值排序:

from operator import itemgetter
sorted(d.items(), key=itemgetter(1))

答案 4 :(得分:151)

在最近的Python 2.7中,我们有了新的OrderedDict类型,它记住了项目的添加顺序。

>>> d = {"third": 3, "first": 1, "fourth": 4, "second": 2}

>>> for k, v in d.items():
...     print "%s: %s" % (k, v)
...
second: 2
fourth: 4
third: 3
first: 1

>>> d
{'second': 2, 'fourth': 4, 'third': 3, 'first': 1}

要从原始字典创建新的有序字典,请按值排序:

>>> from collections import OrderedDict
>>> d_sorted_by_value = OrderedDict(sorted(d.items(), key=lambda x: x[1]))

OrderedDict的行为类似于普通字典:

>>> for k, v in d_sorted_by_value.items():
...     print "%s: %s" % (k, v)
...
first: 1
second: 2
third: 3
fourth: 4

>>> d_sorted_by_value
OrderedDict([('first': 1), ('second': 2), ('third': 3), ('fourth': 4)])

答案 5 :(得分:93)

更新:2015年12月5日使用Python 3.5

虽然我发现接受的答案很有用,但我还感到惊讶的是,它尚未更新为从标准库集合模块引用 OrderedDict 一个可行的,现代的替代方案 - 旨在解决这类问题。

from operator import itemgetter
from collections import OrderedDict

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = OrderedDict(sorted(x.items(), key=itemgetter(1)))
# OrderedDict([(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)])

官方 OrderedDict 文档也提供了一个非常类似的示例,但是使用lambda作为sort函数:

# regular unsorted dictionary
d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

# dictionary sorted by value
OrderedDict(sorted(d.items(), key=lambda t: t[1]))
# OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

答案 6 :(得分:73)

Hank Gay's answer几乎相同:

sorted([(value,key) for (key,value) in mydict.items()])

或者根据John Fouhy的建议略微优化:

sorted((value,key) for (key,value) in mydict.items())

答案 7 :(得分:70)

使用 namedtuple 通常非常方便。例如,你有一个'name'字典作为键,'score'作为值,你想对'score'排序:

import collections
Player = collections.namedtuple('Player', 'score name')
d = {'John':5, 'Alex':10, 'Richard': 7}

首先以最低分数排序:

worst = sorted(Player(v,k) for (k,v) in d.items())

首先以最高分数排序:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)

现在你可以得到名字和得分,让我们说第二好的球员(指数= 1)非常像这样:

player = best[1]
player.name
    'Richard'
player.score
    7

答案 8 :(得分:66)

Python 3.6开始,将订购内置字典

好消息,所以OP的原始用例是从数据库中检索到的映射对,其中唯一的字符串ID作为键,数值作为值添加到内置的Python v3.6 + dict中,现在应该遵循插入顺序。 / p>

如果说来自数据库查询的结果两列表表达式如下:

SELECT a_key, a_value FROM a_table ORDER BY a_value;

将存储在两个Python元组中,k_seq和v_seq(由数字索引对齐,当然长度相同),然后:

k_seq = ('foo', 'bar', 'baz')
v_seq = (0, 1, 42)
ordered_map = dict(zip(k_seq, v_seq))

允许稍后输出:

for k, v in ordered_map.items():
    print(k, v)

在这种情况下产生(对于新的Python 3.6+内置字典!):

foo 0
bar 1
baz 42

以v。

的每个值的相同顺序排列

在我的机器上安装Python 3.5时,它目前产生:

bar 1
foo 0
baz 42

详细说明:

正如Raymond Hettinger在2012年提出的(参见主题为"More compact dictionaries with faster iteration"的python-dev上的邮件)和现在(2016年)由Victor Stinner在邮件中宣布主题为"Python 3.6 dict becomes compact and gets a private version; and keywords become ordered"的python-dev由于在Python 3.6中修复/实现了问题27350 "Compact and ordered dict",我们现在可以使用内置的dict来维护插入顺序!!

希望这将导致薄层OrderedDict实现作为第一步。正如@ JimFasarakis-Hilliard所指出的那样,有些人在未来也会看到OrderedDict类型的用例。我认为整个Python社区将仔细检查,如果这将经得起时间的考验,以及接下来的步骤将是什么。

有时间重新考虑我们的编码习惯,不要错过稳定订购的可能性:

  • 关键字参数和
  • (中级)dict storage

第一个因为它在某些情况下简化了函数和方法实现中的调度。

第二个因为它鼓励在处理管道时更容易使用dict作为中间存储。

Raymond Hettinger亲切地提供了解释“The Tech Behind Python 3.6 Dictionaries”的文档 - 来自旧金山Python Meetup Group 2016-DEC-08的演示文稿。

也许很多Stack Overflow高度装饰的问答页面会收到这些信息的变种,许多高质量的答案也需要每个版本更新。

警告Emptor(但也见以下更新2017-12-15):

正如@ajcr正确地指出:“这个新实现的顺序保留方面被认为是一个实现细节,不应该依赖它。” (来自whatsnew36)没有挑选,引用被削减了一点悲观;-)。它继续作为“(这可能在将来发生变化,但是在更改语言规范之前,希望在几种版本的语言中使用这个新的dict实现,以便为所有当前和未来的Python实现强制保持语义保持语义;这也是有助于保持与随机迭代顺序仍然有效的语言的旧版本的向后兼容性,例如Python 3.5)。“

因此,在某些人类语言(例如德语)中,用法会形成语言,现在已经在whatsnew36中声明了...。

更新2017-12-15:

mail to the python-dev list中,Guido van Rossum宣称:

  

这样做。 “Dict保持插入秩序”是裁决。谢谢!

因此,dict插入排序的版本3.6 CPython副作用现在成为语言规范的一部分(而不再仅仅是实现细节)。正如Raymond Hettinger在讨论中提醒的那样,该邮件线程也为collections.OrderedDict提出了一些明显的设计目标。

答案 9 :(得分:40)

我遇到了同样的问题,我解决了这个问题:

WantedOutput = sorted(MyDict, key=lambda x : MyDict[x]) 

(回答“不可能对dict进行排序”的人没有读到这个问题!事实上,“我可以对键进行排序,但我如何根据值进行排序?”显然意味着他想要按照值的值排序的键列表。)

请注意,订单定义不明确(具有相同值的键将在输出列表中以任意顺序排列)。

答案 10 :(得分:34)

在Python 2.7中,只需执行:

from collections import OrderedDict
# regular unsorted dictionary
d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

# dictionary sorted by key
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)])

http://docs.python.org/dev/library/collections.html#ordereddict-examples-and-recipes

复制粘贴

享受; - )

答案 11 :(得分:25)

这是代码:

import operator
origin_list = [
    {"name": "foo", "rank": 0, "rofl": 20000},
    {"name": "Silly", "rank": 15, "rofl": 1000},
    {"name": "Baa", "rank": 300, "rofl": 20},
    {"name": "Zoo", "rank": 10, "rofl": 200},
    {"name": "Penguin", "rank": -1, "rofl": 10000}
]
print ">> Original >>"
for foo in origin_list:
    print foo

print "\n>> Rofl sort >>"
for foo in sorted(origin_list, key=operator.itemgetter("rofl")):
    print foo

print "\n>> Rank sort >>"
for foo in sorted(origin_list, key=operator.itemgetter("rank")):
    print foo

结果如下:

<强>原始

{'name': 'foo', 'rank': 0, 'rofl': 20000}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Baa', 'rank': 300, 'rofl': 20}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Penguin', 'rank': -1, 'rofl': 10000}

<强> ROFL

{'name': 'Baa', 'rank': 300, 'rofl': 20}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Penguin', 'rank': -1, 'rofl': 10000}
{'name': 'foo', 'rank': 0, 'rofl': 20000}

排名

{'name': 'Penguin', 'rank': -1, 'rofl': 10000}
{'name': 'foo', 'rank': 0, 'rofl': 20000}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Baa', 'rank': 300, 'rofl': 20}

答案 12 :(得分:24)

如果值是数字,您也可以使用Counter中的collections

from collections import Counter

x = {'hello': 1, 'python': 5, 'world': 3}
c = Counter(x)
print(c.most_common())

>> [('python', 5), ('world', 3), ('hello', 1)]    

答案 13 :(得分:22)

尝试以下方法。让我们使用以下数据定义一个名为mydict的字典:

mydict = {'carl':40,
          'alan':2,
          'bob':1,
          'danny':3}

如果想要按键对字典进行排序,可以执行以下操作:

for key in sorted(mydict.iterkeys()):
    print "%s: %s" % (key, mydict[key])

这应返回以下输出:

alan: 2
bob: 1
carl: 40
danny: 3

另一方面,如果想按值对字典进行排序(如问题中所述),可以执行以下操作:

for key, value in sorted(mydict.iteritems(), key=lambda (k,v): (v,k)):
    print "%s: %s" % (key, value)

此命令的结果(按值对字典排序)应返回以下内容:

bob: 1
alan: 2
danny: 3
carl: 40

答案 14 :(得分:21)

您可以创建“倒排索引”,也是

from collections import defaultdict
inverse= defaultdict( list )
for k, v in originalDict.items():
    inverse[v].append( k )

现在您的逆值具有值;每个值都有一个适用键列表。

for k in sorted(inverse):
    print k, inverse[k]

答案 15 :(得分:20)

您可以使用collections.Counter。请注意,这适用于数字和非数字值。

>>> x = {1: 2, 3: 4, 4:3, 2:1, 0:0}
>>> from collections import Counter
>>> #To sort in reverse order
>>> Counter(x).most_common()
[(3, 4), (4, 3), (1, 2), (2, 1), (0, 0)]
>>> #To sort in ascending order
>>> Counter(x).most_common()[::-1]
[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]
>>> #To get a dictionary sorted by values
>>> from collections import OrderedDict
>>> OrderedDict(Counter(x).most_common()[::-1])
OrderedDict([(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)])

答案 16 :(得分:16)

从Python 3.6开始,dict对象现在按插入顺序排序。正式在Python 3.7的规范中。

>>> words = {"python": 2, "blah": 4, "alice": 3}
>>> dict(sorted(words.items(), key=lambda x: x[1]))
{'python': 2, 'alice': 3, 'blah': 4}

在此之前,您必须使用OrderedDict

Python 3.7 documentation说:

  

在3.7版中进行了更改:保证可以插入字典顺序   订购。此行为是3.6版CPython的实现细节。

答案 17 :(得分:15)

您可以使用skip dict这是一个按值永久排序的词典。

>>> data = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
>>> SkipDict(data)
{0: 0.0, 2: 1.0, 1: 2.0, 4: 3.0, 3: 4.0}

如果您使用keys()values()items(),那么您将按值排序。

使用skip list数据结构实现。

答案 18 :(得分:13)

from django.utils.datastructures import SortedDict

def sortedDictByKey(self,data):
    """Sorted dictionary order by key"""
    sortedDict = SortedDict()
    if data:
        if isinstance(data, dict):
            sortedKey = sorted(data.keys())
            for k in sortedKey:
                sortedDict[k] = data[k]
    return sortedDict

答案 19 :(得分:12)

您还可以使用可以传递给密钥的自定义功能。

def dict_val(x):
    return x[1]
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=dict_val)

答案 20 :(得分:10)

As pointed out by Dilettant,Python 3.6现在保持订单!我以为我分享了一个我编写的函数,它简化了迭代(元组,列表,字典)的排序。在后一种情况下,您可以对键或值进行排序,并且可以将数值比较考虑在内。 仅适用于&gt; = 3.6!

当您尝试在包含例如的迭代时使用sorted字符串以及整数,sorted()将失败。当然你可以用str()强制进行字符串比较。但是,在某些情况下,您希望进行实际数字比较,其中12小于20(字符串比较中不是这种情况)。所以我想出了以下内容。当您想要显式数字比较时,您可以使用标志num_as_num,它将尝试通过尝试将所有值转换为浮点数来进行显式数字排序。如果成功,它将进行数字排序,否则它将采用字符串比较。

改进意见或push requests欢迎。

def sort_iterable(iterable, sort_on=None, reverse=False, num_as_num=False):
    def _sort(i):
      # sort by 0 = keys, 1 values, None for lists and tuples
      try:
        if num_as_num:
          if i is None:
            _sorted = sorted(iterable, key=lambda v: float(v), reverse=reverse)
          else:
            _sorted = dict(sorted(iterable.items(), key=lambda v: float(v[i]), reverse=reverse))
        else:
          raise TypeError
      except (TypeError, ValueError):
        if i is None:
          _sorted = sorted(iterable, key=lambda v: str(v), reverse=reverse)
        else:
          _sorted = dict(sorted(iterable.items(), key=lambda v: str(v[i]), reverse=reverse))

      return _sorted

    if isinstance(iterable, list):
      sorted_list = _sort(None)
      return sorted_list
    elif isinstance(iterable, tuple):
      sorted_list = tuple(_sort(None))
      return sorted_list
    elif isinstance(iterable, dict):
      if sort_on == 'keys':
        sorted_dict = _sort(0)
        return sorted_dict
      elif sort_on == 'values':
        sorted_dict = _sort(1)
        return sorted_dict
      elif sort_on is not None:
        raise ValueError(f"Unexpected value {sort_on} for sort_on. When sorting a dict, use key or values")
    else:
      raise TypeError(f"Unexpected type {type(iterable)} for iterable. Expected a list, tuple, or dict")

答案 21 :(得分:9)

以下是使用d.values() and d.keys()上的zip的解决方案。此链接的几行(在Dictionary视图对象上)是:

  

这允许使用zip()创建(值,键)对:pairs = zip(d.values(),d.keys())。

所以我们可以做到以下几点:

d = {'key1': 874.7, 'key2': 5, 'key3': 8.1}

d_sorted = sorted(zip(d.values(), d.keys()))

print d_sorted 
# prints: [(5, 'key2'), (8.1, 'key3'), (874.7, 'key1')]

答案 22 :(得分:7)

使用dicts中的 ValueSortedDict

from dicts.sorteddict import ValueSortedDict
d = {1: 2, 3: 4, 4:3, 2:1, 0:0}
sorted_dict = ValueSortedDict(d)
print sorted_dict.items() 

[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]

答案 23 :(得分:6)

如果您的值是整数,并且您使用的是Python 2.7或更高版本,则可以使用collections.Counter代替dictmost_common方法将为您提供所有项目,按值排序。

答案 24 :(得分:6)

当然,请记住,您需要使用OrderedDict,因为常规Python词典不会保留原始顺序。

from collections import OrderedDict
a = OrderedDict(sorted(originalDict.items(), key=lambda x: x[1]))

如果您没有Python 2.7或更高版本,您可以做的最好的事情就是迭代生成器函数中的值。 (2.4和2.6 hereOrderedDict,但

a)我不知道它的运作情况

b)当然,您必须下载并安装它。如果您没有管理员权限,那么我担心这个选项会被淘汰。)

def gen(originalDict):
    for x, y in sorted(zip(originalDict.keys(), originalDict.values()), key=lambda z: z[1]):
        yield (x, y)
    #Yields as a tuple with (key, value). You can iterate with conditional clauses to get what you want. 

for bleh, meh in gen(myDict):
    if bleh == "foo":
        print(myDict[bleh])

您还可以打印出每个值

for bleh, meh in gen(myDict):
    print(bleh, meh)

如果不使用Python 3.0或更高版本

,请记得在打印后删除括号

答案 25 :(得分:6)

通过dict迭代并按其值按降序对其进行排序:

$ python --version
Python 3.2.2

$ cat sort_dict_by_val_desc.py 
dictionary = dict(siis = 1, sana = 2, joka = 3, tuli = 4, aina = 5)
for word in sorted(dictionary, key=dictionary.get, reverse=True):
  print(word, dictionary[word])

$ python sort_dict_by_val_desc.py 
aina 5
tuli 4
joka 3
sana 2
siis 1

答案 26 :(得分:5)

这适用于3.1.x:

import operator
slovar_sorted=sorted(slovar.items(), key=operator.itemgetter(1), reverse=True)
print(slovar_sorted)

答案 27 :(得分:5)

为了完整起见,我使用heapq发布解决方案。请注意,此方法适用于数字和非数字值

>>> x = {1: 2, 3: 4, 4:3, 2:1, 0:0}
>>> x_items = x.items()
>>> heapq.heapify(x_items)
>>> #To sort in reverse order
>>> heapq.nlargest(len(x_items),x_items, operator.itemgetter(1))
[(3, 4), (4, 3), (1, 2), (2, 1), (0, 0)]
>>> #To sort in ascending order
>>> heapq.nsmallest(len(x_items),x_items, operator.itemgetter(1))
[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]

答案 28 :(得分:5)

刚从Python for Everybody学到相关技能。

您可以使用临时列表来帮助您对字典进行排序:

#Assume dictionary to be:
d = {'apple': 500.1, 'banana': 1500.2, 'orange': 1.0, 'pineapple': 789.0}

# create a temporary list
tmp = []

# iterate through the dictionary and append each tuple into the temporary list 
for key, value in d.items():
    tmptuple = (value, key)
    tmp.append(tmptuple)

# sort the list in ascending order
tmp = sorted(tmp)

print (tmp)

如果要按降序对列表进行排序,只需将原始排序行更改为:

tmp = sorted(tmp, reverse=True)

使用列表理解,一个班轮将是:

#Assuming the dictionary looks like
d = {'apple': 500.1, 'banana': 1500.2, 'orange': 1.0, 'pineapple': 789.0}
#One liner for sorting in ascending order
print (sorted([(v, k) for k, v in d.items()]))
#One liner for sorting in descending order
print (sorted([(v, k) for k, v in d.items()], reverse=True))

示例输出:

#Asending order
[(1.0, 'orange'), (500.1, 'apple'), (789.0, 'pineapple'), (1500.2, 'banana')]
#Descending order
[(1500.2, 'banana'), (789.0, 'pineapple'), (500.1, 'apple'), (1.0, 'orange')]

答案 29 :(得分:3)

由于要求保留与旧版Python的向后兼容性,我认为OrderedDict解决方案是非常不明智的。你想要的东西适用于Python 2.7和旧版本。

但是另一个答案中提到的集合解决方案绝对是一流的,因为你重新训练了键和值之间的联系,这在字典的情况下非常重要。

我不同意另一个答案中提出的头号选择,因为它会丢掉钥匙。

我使用了上面提到的解决方案(下面显示的代码)并保留了对键和值的访问权限,在我的例子中,排序是在值上,但重要的是在排序值后键的顺序。

from collections import Counter

x = {'hello':1, 'python':5, 'world':3}
c=Counter(x)
print c.most_common()


>> [('python', 5), ('world', 3), ('hello', 1)]

答案 30 :(得分:3)

months = {"January": 31, "February": 28, "March": 31, "April": 30, "May": 31,
          "June": 30, "July": 31, "August": 31, "September": 30, "October": 31,
          "November": 30, "December": 31}

def mykey(t):
    """ Customize your sorting logic using this function.  The parameter to
    this function is a tuple.  Comment/uncomment the return statements to test
    different logics.
    """
    return t[1]              # sort by number of days in the month
    #return t[1], t[0]       # sort by number of days, then by month name
    #return len(t[0])        # sort by length of month name
    #return t[0][-1]         # sort by last character of month name


# Since a dictionary can't be sorted by value, what you can do is to convert
# it into a list of tuples with tuple length 2.
# You can then do custom sorts by passing your own function to sorted().
months_as_list = sorted(months.items(), key=mykey, reverse=False)

for month in months_as_list:
    print month

答案 31 :(得分:1)

除了使用内置模块等,我尝试手动解决..... 首先,我创建了一个函数,其功能是返回字典的每个项目的最小值:

def returnminDict(_dct):
    dict_items = _dct.items()
    list_items = list(dict_items)
    init_items = list_items[0]
    for i in range(len(list_items)):
        if list_items[i][1] > init_items[1]:
           continue
        else:
           init_items = list_items[i]
    return init_items

第二,现在我们有一个函数,该函数返回具有最小值的项目,然后我制作一个新的字典,然后遍历该字典:

def SelectDictSort(_dct):
    new_dict = {}
    while _dct:
        mindict = returnminDict(_dct)
        new_dict.update(dict((mindict,)))
        _dct.pop(mindict[0])
    return new_dict

我尝试此SelectDictSort({2: 5, 5: 1, 4: 3, 1: 1, 0: 1, 9: 2, 8: 2})将返回:

{0: 1, 1: 1, 5: 1, 8: 2, 9: 2, 4: 3, 2: 5}

嗯...我不知道哪个是正确的,但这是我尝试过的。...

(代码从retrun new_dct更新为return new_dict

答案 32 :(得分:0)

此方法不会使用lambda并且在Python 3.6上运行良好:

 # sort dictionary by value
d = {'a1': 'fsdfds', 'g5': 'aa3432ff', 'ca':'zz23432'}
def getkeybyvalue(d,i):
    for k, v in d.items():
        if v == i:
            return (k)

sortvaluelist = sorted(d.values())

# In >> Python 3.6+ << the INSERTION-ORDER of a dict is preserved. That is,
# when creating a NEW dictionary and filling it 'in sorted order',
# that order will be maintained.
sortresult ={}
for i1 in sortvaluelist:   
    key = getkeybyvalue(d,i1)
    sortresult[key] = i1
print ('=====sort by value=====')
print (sortresult)
print ('=======================')

答案 33 :(得分:0)

使用Python 3.2:

x = {"b":4, "a":3, "c":1}
for i in sorted(x.values()):
    print(list(x.keys())[list(x.values()).index(i)])