无法预测iterkeys()输出顺序

时间:2014-02-03 08:19:16

标签: python

问题:为什么退出会显示为我输出的第一行?


让我先说一下,我在尝试解决我正在编写的python脚本中的特定问题时编写了这段代码。所以,是的,我知道这段代码可能看起来很难看。

我无法弄清楚为什么首先显示 EXIT 。我甚至尝试过' Quit' :'退出' 到字典的开头(在'设置'之前,但它仍然显示相同。我无法判断是否与某事有关一般的iterkeys或词典的性质。

起初,我的猜测是,这可能与 mmenu [' Quit'] 是一个字符串和 mmenu [&#39]有关。 ;设置'] 是一个字典,但后来我注意到以下顺序输出如下:

  

重命名:输入新名称
  在哪里?
  删除:选择要删除的菜单项

当他们被编码为:

'Rename': 'Rename: Enter a new name', 
'Delete': 'Delete: Select Menu Item to Delete', 
'Move_Item': 'Where?'

但我能弄清楚的是重要的原因。

任何见解都表示赞赏:)

#!/usr/bin/python
from inspect import isfunction

def create():
  print "create function: you've just created a menu"
  pass

mmenu = {
  'Settings': 
    {
    'Edit': 
      {
      'Create': create, 
      'Modify': 
    {
    'Rename': 'Rename: Enter a new name', 
    'Delete': 'Delete: Select Menu Item to Delete', 
    'Move_Item': 'Where?'
    }
      }, 
    'Default_Settings': 'Default Settings'}, 
  'Quit' : 'EXIT'
  }

nmenu = mmenu
omenu = {}

def dictloop(dmenu):
  global omenu
  nmenu = dmenu
  for key in nmenu.iterkeys():
    if isfunction(nmenu[key]):
      nmenu[key]()
    if type(nmenu[key]) is str:
      print nmenu[key]
    if type(nmenu[key]) is dict:
      omenu = nmenu[key]
      dictloop(omenu)

dictloop(nmenu)

输出:

EXIT
create function: you've just created a menu
Rename: Enter a new name
Where?
Delete: Select Menu Item to Delete
Default Settings

1 个答案:

答案 0 :(得分:0)

这是Python用于为其dict创建订单的方法:

  1. 在内存中创建一个大于dict的列表,它的大小是一个幂 2(例如32)
  2. 从字典中隐藏字符串
  3. 使用掩码检索每个哈希的一小部分(例如哈希('x')& 31)
  4. 使用此值作为在列表中存储原始字符串的索引
  5. 列表中的几个位置将为空,因此此方法不会有效地使用内存,但这意味着可以使用二进制搜索在一个计算中检索字典中任何项目的位置。 (例如hash('x')& 31 == key ['x']的索引)

    这里有一个很好的描述: http://www.laurentluce.com/posts/python-dictionary-implementation/