【问题标题】:Python: Iterate alphabetically over OrderedDictPython:按字母顺序迭代 OrderedDict
【发布时间】:2013-05-18 07:41:06
【问题描述】:

在一个脚本中,我有一个 OrderedDict groups,它按字母顺序获取键/值对。

在脚本的另一部分,我正在检查与key 相同的文件,如下所示:

for (key, value) in groups.items():        
    file = open(key, 'r') 
    # do stuff

事情发生得很好,其中一部分是为每个文件打印一个状态行,但是我怎样才能让 Python 按字母顺序或至少按数字顺序遍历 groups(因为它们是按字母顺序输入的无论如何订购)?

【问题讨论】:

  • 如何添加键/值对?
  • 你需要它们在字典里吗?元组或列表中的键/值对是否足够?然后,您可以根据需要从键/值对的线性结构中生成 OrderedDict。

标签: python python-2.7 ordereddictionary


【解决方案1】:

OrderedDict 的全部意义在于您可以按照输入键的顺序正常迭代它:

>>> from collections import OrderedDict
>>> d = OrderedDict()
>>> d[1] = 2
>>> d[0] = 3
>>> d[9] = 2
>>> for k, v in d.items():
        print(k, v)


(1, 2)
(0, 3)
(9, 2)

只要确保您没有为 OrderedDict(...) 提供字典来初始化它,否则它开始时是无序的。

【讨论】:

  • 我会这样说,因为我仍然看到它看似随机地迭代。例如,我有名称为 movies blu-rayhdtv 的键,但是每当我运行上述命令时,输出顺序永远不会按照输入的顺序排列。
  • @TurboTurtle 你在喂它一本字典吗?它从哪个数据结构开始?你也可以举个例子吗
  • 啊!我现在觉得很傻,实际上我还在给它喂字典。我以为我已经更改了该功能,但显然我忽略了这一点。
  • @TurboTurtle:在这种情况下,您应该删除您的问题,或者至少更新它,以免其他人浪费时间。
【解决方案2】:

如果您只想按键的顺序遍历字典,则可以使用常规字典和sorted()

>>> d = dict(s=5,g=4,a=6,j=10)
>>> d
{'g': 4, 's': 5, 'j': 10, 'a': 6}
>>> for k in sorted(d):
        print(k, ':', d[k])


a : 6
g : 4
j : 10
s : 5
>>> 

(请原谅python3 print()

如果您真的想坚持使用有序字典,请阅读 documentation,其中显示了重新排序 OrderedDict 的示例:

>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

>>> # dictionary sorted by key
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

如果您真的首先按字母顺序将它们输入OrderedDict,那么我不确定您为什么会遇到麻烦。

【讨论】:

  • sorted(d) 优于 sorted(d.keys())
  • 啊……太棒了,我什至没有意识到这一点!
猜你喜欢
  • 2013-05-09
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多