字典的更新方法-Python

时间:2010-12-09 12:42:34

标签: python

我编写了一个代码,尝试使用值而不是键

对字典进行排序
""" 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} 

5 个答案:

答案 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())))