按字母顺序排序字典

时间:2015-01-20 16:39:14

标签: python 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的人也被错误地打印(向后)。

1 个答案:

答案 0 :(得分:5)

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

字典本质上是无序的,是关键字:值映射的集合。如果您希望按顺序打印字典,按键排序,则可以

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')])