如何对字典进行排序?

5
问题是一个房间号码和客人详细信息的列表,我从txt文件中直接提取,需要将其放入字典中,房间号码作为键,详细信息作为值。
客人清单就是一个列表,每个项目代表房间号码、客人姓名、到达和离开日期。没有任何内容与他们相邻的房间是空的。
nlist = [['101'], ['102'], ['103'], 
['201', ' John Cleese', ' 5/5/12', ' 5/7/12'], ['202'], 
['203', ' Eric Idle', ' 7/5/12', ' 8/7/12'], ['301'], ['302'], ['303']]

基本上,需要将其放入字典中。这是我尝试的方法:
guests = {}
for i in nlist:
        if len(i) == 1:
            key = i[0]
            guests[key] = None
        else:
            key = i[0]
            val = i[1],i[2],i[3]
            guests[key] = val

这给了我:

guests = {'201': (' John Cleese', ' 5/5/12', ' 5/7/12'), 
'203': (' Eric Idle', ' 7/5/12', ' 8/7/12'), '202': None, '301': None, 
'302': None, '303': None, '102': None, '103': None, '101': None}

您可以看到,这个字典没有按照任何特定的顺序组合起来。然而,对于这个特定的练习,字典需要按照房间号从低到高的顺序排列。我以为它会只是从头到尾迭代每个内部列表,测试它,并按照那个顺序构建字典。

有谁知道如何编写代码,使得字典按照 {'101': None, '102', None, '103': None... 等)的顺序呈现?并且希望有人能够解释为什么我的代码没有像我预期的那样工作。


3
字典条目被存储为哈希表,它们天生是无序的。你的功课是否需要使用字典?为什么需要有序? - Joel Cornett
可能是Python字典中的项目排序的重复问题。 - Wooble
1
抱歉,各位,我的标题有点误导人,不是吗?我更感兴趣的是为什么字典会以那种特定的方式混淆。从你们所有的答案中我所了解到的是,“它就是这样”。是的,它需要一个字典,但如果我使用aix下面的代码,我可能可以用一个无序的字典来解决问题。 - bang
@bang: 通过使用哈希函数将每个键映射到内存中的位置,字典实现了快速查找时间。这意味着哈希函数决定了键的顺序。根据具体的哈希函数,此顺序可能不同。这篇文章可能会有所帮助:http://en.wikipedia.org/wiki/Hash_table。 - Joel Cornett
1个回答

10

标准Python字典本质上是无序的。

一种可能性是使用 OrderedDict。它将保留插入顺序,这意味着您必须按照希望检索它们的顺序插入条目。

另一种可能性是保持不变的dict,但按所需顺序进行迭代:

for k, v in sorted(guests.items()):
  print k, v

最后需要注意的是,你的示例将房间号码存储为字符串而不是整数。这意味着排序是按字典顺序进行的('90' > '100')。由于这是一道作业题,我留给读者去练习如何解决这个问题。


1
好的编辑。可能(因为这是作业),原帖作者只能使用特定的数据类型。 - Joel Cornett
需要指出的是,OrderedDict 的排序是基于插入顺序而不是键(房间号)的,因此根据输入文本文件的不同,它可能不适用。 - hexparrot
请注意,房间号实际上是字符串,并且排序是按字典顺序进行的。如果较小的数字被写为“'5'”而不是“'005'”,则无法正常工作。如果可能出现这种情况,则一种选择是将它们转换为整数。 - pepr
2
for k, v in sorted(guests.items())也可以正常工作,避免了重新查找字典的麻烦。 - Danica
谢谢你们的回复。问题说明了键必须存储为字符串,而所有房间都是3位数长,所以我可能不会遇到那个问题。不过我理解你们的意思。我认为我应该能够使用无序字典并按照你说的正确顺序进行迭代。 - bang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接