如何按字母顺序对此词典进行排序?

时间:2013-04-11 02:32:34

标签: python python-3.x

这是字典:

lettersandnumbers = {'Z': 1, 'Y': 0, 'X': 1, 'W': 17, 'V': 4, 'U': 0,\
 'T': 22, 'S': 21, 'R': 31, 'Q': 0, 'P': 12, 'O': 8,\
 'N': 10, 'M': 29, 'L': 27, 'K': 14, 'J': 51, 'I': 7,\
 'H': 14, 'G': 21, 'F': 12, 'E': 27, 'D': 40, 'C': 43,\
 'B': 28, 'A': 34}

我希望按字母顺序排序。 我已经尝试将它变成一个列表,所以我可以使用排序函数,但我完全迷失了。 有什么想法吗?

5 个答案:

答案 0 :(得分:2)

词典只是一个容器。如果要按排序顺序迭代键,请参阅In Python, how do I iterate over a dictionary in sorted order?

答案 1 :(得分:2)

有几种方法可以进行迭代,上面的链接描述了对字典进行一次性排序的方法。如果您需要 persistent 有序字典,使用Python 2.7和3.x,您可以使用 OrderedDict 集合,请参阅下面的示例:

>>> from collections import OrderedDict
# Random dictionary
>>> foo = {'a': 1, 'b':2, 'e':4, 'd':6, 'f': 7}
>>> foo
{'a': 1, 'b':2, 'e':4, 'd':6, 'f': 7}
# OrderedDict remember order of insert, hence to maintain a sorted
# dictionary entry, we must supplies a sorted tuple the example below
# sorted by entry key
>>> bar = OrderedDict(sorted(foo.items(), key=lambda t: t[0]))
>>> bar
OrderedDict([('a', 1), ('b', 2), ('d', 6), ('e', 4), ('f', 7)])

尽管符号有所不同, bar 对象的功能与字典完全相同。

答案 2 :(得分:0)

由于@Nerolynx拒绝使用他的方法更简单,更快的版本

>>> from collections import OrderedDict
>>> d = {'Z': 1, 'Y': 0, 'X': 1, 'W': 17, 'V': 4, 'U': 0, 'T': 22, 'S': 21, 'R': 31, 'Q': 0, 'P': 12, 'O': 8,'N': 10, 'M': 29, 'L': 27, 'K': 14, 'J': 51, 'I': 7,      'H': 14, 'G': 21, 'F': 12, 'E': 27, 'D': 40, 'C': 43, 'B': 28, 'A': 34}
>>> OrderedDict(sorted(d.items()))
OrderedDict([('A', 34), ('B', 28), ('C', 43), ('D', 40), ('E', 27), ('F', 12), ('G', 21), ('H', 14), ('I', 7), ('J', 51), ('K', 14), ('L', 27), ('M', 29), ('N', 10), ('O', 8), ('P', 12), ('Q', 0), ('R', 31), ('S', 21), ('T', 22), ('U', 0), ('V', 4), ('W', 17), ('X', 1), ('Y', 0), ('Z', 1)])

答案 3 :(得分:0)

>>> from collections import OrderedDict
>>> from string import ascii_uppercase as alphabet
>>> d = {'Z': 1, 'Y': 0, 'X': 1, 'W': 17, 'V': 4, 'U': 0, 'T': 22, 'S': 21, 'R': 31, 'Q': 0, 'P': 12, 'O': 8,'N': 10, 'M': 29, 'L': 27, 'K': 14, 'J': 51, 'I': 7,      'H': 14, 'G': 21, 'F': 12, 'E': 27, 'D': 40, 'C': 43, 'B': 28, 'A': 34}
>>> OrderedDict((k, d[k]) for k in alphabet if k in d)
OrderedDict([('A', 34), ('B', 28), ('C', 43), ('D', 40), ('E', 27), ('F', 12), ('G', 21), ('H', 14), ('I', 7), ('J', 51), ('K', 14), ('L', 27), ('M', 29), ('N', 10), ('O', 8), ('P', 12), ('Q', 0), ('R', 31), ('S', 21), ('T', 22), ('U', 0), ('V', 4), ('W', 17), ('X', 1), ('Y', 0), ('Z', 1)])

答案 4 :(得分:0)

如果您使用[some dict].items(),它会生成一个元组列表:

>>> d={3:'three',35:'thirty five',100:'one hindred'}
>>> d
{35: 'thirty five', 3: 'three', 100: 'one hindred'}
>>> d.items()
[(35, 'thirty five'), (3, 'three'), (100, 'one hindred')]

元组在Python中是可排序的:

>>> sorted(d.items())
[(3, 'three'), (35, 'thirty five'), (100, 'one hindred')]

因此,您的词典按照您的需要使用Python的默认排序顺序进行排序:

>>> lettersandnumbers = {'Z': 1, 'Y': 0, 'X': 1, 'W': 17, 'V': 4, 'U': 0,'T': 22, 'S': 21, 'R': 31, 'Q': 0, 'P': 12, 'O': 8,'N': 10, 'M': 29, 'L': 27, 'K': 14, 'J': 51, 'I': 7,'H': 14, 'G': 21, 'F': 12, 'E': 27, 'D': 40, 'C': 43,'B': 28, 'A': 34}
>>> sorted(lettersandnumbers.items())
[('A', 34), ('B', 28), ('C', 43), ('D', 40), ('E', 27), ('F', 12), ('G', 21), ('H', 14), ('I', 7), ('J', 51), ('K', 14), ('L', 27), ('M', 29), ('N', 10), ('O', 8), ('P', 12), ('Q', 0), ('R', 31), ('S', 21), ('T', 22), ('U', 0), ('V', 4), ('W', 17), ('X', 1), ('Y', 0), ('Z', 1)]

(如果所需的顺序与默认顺序不同,您可能需要使用已排序的key参数。在这种情况下,默认有效。)

然后,如果你想要一个保持这个顺序的字典:

>>> from collections import OrderedDict
>>> od=OrderedDict(sorted(lettersandnumbers.items()))
>>> od.items()[0]
('A', 34)
>>> od.items()[-1]
('Z', 1)

但是有序的dict是基于插入顺序的,所以如果添加不按排序顺序的任何内容,它将被取消排序。

更好的是,避免制作一个不必要的dict副本,并根据需要在当前的排序顺序中迭代dict:

for k,v in sorted(d.items()): 
    # deal with the key and value in sorted order at that moment...

使用Python 2,您需要使用d.iteritems(),否则您将生成2个临时列表:1表示项目,1表示排序。使用Py 3(或使用Py 2和d.iteritems()方法),仅为排序生成1个临时列表。