为什么使用setdefault()创建的Python字典会无序?

7

我刚开始尝试使用Python(有VBA背景)。为什么这个字典会无序创建?它不应该是a:1,b:2...等等吗?

class Card:
def county(self):
    c = 0
    l = 0
    groupL = {}  # groupL for Loop
    for n in range(0,13):
        c += 1
        l = chr(n+97)
        groupL.setdefault(l,c)
    return groupL

pick_card = Card()
group = pick_card.county()
print group

以下是输出结果:

{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8, 'k': 11, 'j': 10, 'm': 13, 'l': 12}

或者,它只是无序地打印出来吗?

1
顺便问一下,你为什么在这里使用setdefault?虽然有很多情况下它是一个有用的函数,但对于只是将东西插入到字典中,groupL[l] = c可能是你想要的。 - abarnert
可能是Python字典,如何保持键/值与声明的顺序相同?的重复问题。 - Arya McCarthy
1个回答

17

在Python中,字典是无序的。换句话说,当你迭代字典时,键/项被“yielded”的顺序并不是你将它们放入字典的顺序(如果你在不同版本的Python上尝试运行代码,你可能会得到不同顺序的输出)。如果你想要一个有序的字典,你需要使用collections.OrderedDict,该对象直到Python 2.7之后才被引入。如果你使用较旧版本的Python,可以在ActiveState上找到相应的解决方案。然而,通常只需对项进行排序就足够了(例如:sorted(mydict.items()))。

编辑:按要求提供一个OrderedDict示例:

from collections import OrderedDict
groupL = OrderedDict()  # groupL for Loop
c = 0
for n in range(0,13):
    c += 1
    l = chr(n+97)
    groupL.setdefault(l,c)

print (groupL)

首先,感谢您!但是,为什么数字和字母会特意以某种顺序出现?它们是通过循环按顺序输入的,不是吗?不管怎样,您可以给一个collections.OrderedDict的快速示例吗?非常感谢。 - DBWeinstein
1
@dwstein 几乎所有的Python实现都使用哈希映射来通过键快速访问字典的值。 - phihag
2
@dwstein:它们输入的顺序并不重要 - David Robinson
我想我懂了,事实上这并不重要很有趣。我需要努力理解这一点。 - DBWeinstein
5
或许可以想象一本字典(比如《韦氏词典》)来帮助理解。每次更新版本时,都可以添加新词语和定义。但是它们存储的顺序与添加的顺序无关。它们按最便于查找的顺序存储。Python 字典也是这样工作的。 - David Robinson
显示剩余4条评论

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