代码之家  ›  专栏  ›  技术社区  ›  prosseek

在python中如何保持字典参数的顺序?

  •  1
  • prosseek  · 技术社区  · 14 年前

    def createNode(doc_, **param_):
        cache = {'p':'property','l':'label','td':'totalDelay','rd':'routeDelay','ld':'logicDelay'}
        for index in param_:
            newIndex = cache[index]
            value = param_[index]
            print newIndex, '=', value
    
    

    doc = 10 createNode(doc, p='path', l='ifft4k_radix4_noUnolling_core.vi', td='3.0', ld='1.0', rd='2.0')

    在python 2.6上运行这段代码给出了以下结果。

    routeDelay = 2.0
    property = path
    totalDelay = 3.0
    logicDelay = 1.0
    label = ifft4k_radix4_noUnolling_core.vi
    

    我需要保持参数的顺序,我的意思是, property 先来,然后 label 直到我得到 routeDelay 最后。

    问:在python中,如何保持字典参数的顺序?

    3 回复  |  直到 12 年前
        1
  •  7
  •   Alex Martelli    14 年前

    我需要保持 参数,我的意思是,属性 首先,然后贴上标签直到我 上次重新输出延迟。

    那么你只是按错误的顺序做事——不需要按顺序编字典!尝试用成对的元组 隐藏物 如下:

    def createNode(doc_, **param_):
        cache = ( ('p', 'property'), , ('l', 'label'), ('td', 'totalDelay'),
                  ('rd', 'routeDelay'), ('ld', 'logicDelay') )
        for index, newIndex in cache:
            if index not in param_:
                continue
            value = param_[index]
            print newIndex, '=', value
    

    它的语义与您的版本完全相同 createNode ,再加上维护您希望的订单所需的属性,性能至少也一样好。把重点放在“保持字典的有序性”上,你就把重点放在了错误的问题上(唉,情况也是如此,因为 人们可以找到“有序字典”的案例!-)

        2
  •  6
  •   Community rohancragg    7 年前

    一本普通字典不行,你得用一本订好的字典来代替。查看以下链接:

    1. PEP 372: Adding an ordered dictionary to collections
    2. Using an ordered dict as object dictionary in python --一个证明人们正在使用PEP 372的ODICT的问题是:—)
    3. Nicola Larosa & Michael Foord's odict module

    如果你想在谷歌搜索更多信息,可以试试搜索术语“python-ordered dictionary”。我记得在这里看到了一些有序的与听写相关的问题,所以,如果由于某种原因,上面的链接不够充分,也许您可以在其他问题中找到更好的内容。

    更新:事实上,Mark使用元组列表的建议可能非常好,但是命名的元组可能更方便: a relevant fragment in the docs . 另外,如果您计划对数据进行一些序列化/反序列化,并希望这样做 真快 ,查看谷歌的 protocol buffers (提供python工具)。

        3
  •  3
  •   Mark Byers    14 年前

    字典不保留键的顺序。您可以使用元组列表而不是字典。