我编写了一个代码,尝试使用值而不是键
对字典进行排序""" This module sorts a dictionary based on the values of the keys"""
adict={1:1,2:2,5:1,10:2,44:3,67:2} #adict is an input dictionary
items=adict.items()## converts the dictionary into a list of tuples
##print items
list_value_key=[ [d[1],d[0]] for d in items] """Interchanges the position of the
key and the values"""
list_value_key.sort()
print list_value_key
key_list=[ list_value_key[i][1] for i in range(0,len(list_value_key))]
print key_list ## list of keys sorted on the basis of values
sorted_adict={}
*for key in key_list:
sorted_adict.update({key:adict[key]})
print key,adict[key]
print sorted_adict*
因此,当我打印key_list时,我得到了预期的答案,但对于我尝试更新字典的代码的最后部分,顺序不是它应该是什么。以下是获得的结果。我不确定为什么“更新”方法不起作用。任何帮助或指示表示赞赏
结果:
sorted_adict={1: 1, 2: 2, 67: 2, 5: 1, 10: 2, 44: 3}
答案 0 :(得分:3)
Python词典,无论你如何插入它们,都是无序的。一般来说,这就是哈希表的本质。
相反,也许您应该按照其值或排序的顺序保留一个键列表,例如:[ 5, 1, 44, ...]
这样,您可以稍后按排序顺序访问字典。
答案 1 :(得分:2)
不要那样。
import operator
adict={1:1,2:2,5:1,10:2,44:3,67:2}
sorted_adict = sorted(adict.iteritems(), key=operator.itemgetter(1))
答案 2 :(得分:2)
如果您需要一个保留其订单的字典,collections module中会有一个名为OrderedDict
的类。您可以使用该页面上的配方对字典进行排序,并创建一个保留排序顺序的新OrderedDict。 {2.7}或3.1中提供了OrderedDict
类。
答案 3 :(得分:1)
要对您的词典进行排序,您还可以使用:
adict={1:1,2:2,5:1,10:2,44:3,67:2}
k = adict.keys()
k.sort(cmp=lambda k1,k2: cmp(adict[k1],adict[k2]))
顺便说一句,之后重用一个词典是没用的,因为dict
中没有顺序(它们只是映射类型 - 你可以使用不同类型的键,而不是“可比”)。 / p>
答案 4 :(得分:1)
一个问题是普通词典由于内部实现的方式而无法排序。 Python 2.7和3.1在他的OrderedDict
模块中添加了一个名为collections
的新类,正如@ {3}}中提到的@kindall。虽然它们不能完全排序,但它们确实保留或记住了键和关联值添加到它们的顺序,无论它是如何完成的(包括通过update()
方法)。 这意味着您可以通过按照所需顺序将输入字典中的所有内容添加到OrderedDict
输出字典来实现您的目的。
要做到这一点,你所拥有的代码就是在创建你所谓的list_value_key
列表并对其进行排序的意义上。创建该列表的初始未排序版本的方式比使用内置zip()
函数的方式稍微简单快一些。以下是说明如何执行此操作的代码:
from collections import OrderedDict
adict = {1:1, 2:2, 5:1, 10:2, 44:3, 67:2} # input dictionary
# zip together and sort pairs by first item (value)
value_keys_list = sorted(zip(adict.values(), adict.keys()))
sorted_adict = OrderedDict() # value sorted output dictionary
for pair in value_keys_list:
sorted_adict[pair[1]] = pair[0]
print sorted_adict
# OrderedDict([(1, 1), (5, 1), (2, 2), (10, 2), (67, 2), (44, 3)])
以上内容可以改写为相当优雅的单行:
sorted_adict = OrderedDict((pair[1], pair[0])
for pair in sorted(zip(adict.values(), adict.keys())))