【问题标题】:Why does this python dictionary get created out of order using setdefault()?为什么这个 python 字典使用 setdefault() 乱序创建?
【发布时间】:2012-07-31 20:39:54
【问题描述】:

我刚刚开始玩 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}

或者,它是否只是乱序打印?

【问题讨论】:

标签: python dictionary for-loop setdefault


【解决方案1】:

字典在 python 中没有顺序。换句话说,当您遍历字典时,键/项目“产生”的顺序​​不是您将它们放入字典的顺序。 (在不同版本的 python 上尝试您的代码,您可能会得到不同顺序的输出)。如果你想要一个有序的字典,你需要一个 collections.OrderedDict 直到 python 2.7 才引入。如果您使用的是旧版本的 python,您可以在 ActiveState 上找到等效的食谱。但是,通常只对项目进行排序就足够了(例如sorted(mydict.items())

EDIT 根据要求,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 的简单例子吗?非常感谢。
  • @dwstein 几乎所有的 Python 实现都使用hash maps 以允许通过键非常快速地访问字典的值。
  • @dwstein:无所谓输入的顺序。
  • 我想我明白了。无关紧要的事实很有趣。将不得不把我的大脑包裹起来。
  • @dwstein:考虑一个字面字典(如“Merriam-Webster”)可能会有所帮助。每个新版本都可以将新单词和定义添加到字典中。但是它们存储的顺序与添加它们的顺序无关。它们以最容易查找的顺序存储。 Python 字典的工作方式相同。
猜你喜欢
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
  • 2016-12-01
  • 2019-03-03
  • 1970-01-01
  • 2013-08-31
  • 2015-01-11
相关资源
最近更新 更多