按字母顺序对字典进行排序

Alphabetically sorting a dictionary

我对此进行了一些研究;但是,当我尝试将它实现到我的代码中时,我没有成功。这是我目前所拥有的:

f = open('ClassA.txt', 'r')
dictionary = {}
for line in f:
    firstpart, secondpart = line.strip().split(':')
    dictionary[firstpart.strip()] = secondpart.strip()
f.close()
sorted_dict = {k: sorted(v) for k, v in dictionary.items()}
print (sorted_dict)

ClassA.txt 将包含例如:

Jakub Scored: 10
Dan Scored: 10
Jake Scored: 9
Harry Scored: 5

我希望名字按字母顺序排列。但是,当我打印 sorted_dict 时,它会出现:

{'Jakub Scored': ['0', '1'], 
 'Dan Scored': ['0', '1'], 
 'Harry Scored': ['5'], 
 'Jake Scored': ['9']}

不仅顺序不对,还因为某些原因打了10的人打印错了(倒着)。

sorted(v) 将按字母顺序对字符串进行排序,返回已排序字符的列表。这会将 0 放在 1 之前,因为这就是它们的定义方式(想想 0、1、2、3、4、5 ...)。

字典本质上是无序的,是 key:value 映射的集合。如果你想按顺序打印字典,按键排序,那么你可以做

print(sorted(sorted_dict))

请注意,这不会永久改变字典的排序,如果您在此之后尝试 print(sorted_dict),则排序可能会取消排序。

如果您需要永久排序的字典,那么您应该查找 collections.OrderedDict

OrderedDicts 只记住插入的顺序,您不能对它们进行排序然后保持排序的顺序。使用 OrderedDict 时,您的代码可能看起来像这样(请注意,我已经删除了关于对 10 等进行排序的部分,因为我 认为 这不是您想要的,但是如果您你总是可以添加它吗)。

注意:关于sStringIO的部分可以忽略,那只是我创建一个类似文件的对象来测试代码。

from collections import OrderedDict
from io import StringIO

s = '''Jakub Scored: 10
Dan Scored: 10
Jake Scored: 9
Harry Scored: 5'''

f = StringIO(s)

dictionary = {}
for line in f:
    firstpart, secondpart = line.strip().split(':')
    dictionary[firstpart.strip()] = secondpart.strip()
f.close()

sorted_dict = OrderedDict(sorted(dictionary.items()))

print(sorted_dict)
# OrderedDict([('Dan Scored', '10'), ('Harry Scored', '5'), ('Jake Scored', '9'), ('Jakub Scored', '10')])