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

1 投票
3 回答
2850 浏览
提问于 2025-04-15 19:31
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
routeDelay = 2.0
property = path
totalDelay = 3.0
logicDelay = 1.0
label = ifft4k_radix4_noUnolling_core.vi

这里有一段代码:

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

在Python 2.6上运行这段代码,得到了一个结果。

我需要保持参数的顺序,也就是说,property要放在最前面,然后是label,最后是routeDelay

问题是:在Python中,怎么才能保持字典参数的顺序呢?

3 个回答

3

字典不保留键的顺序。你可以用一个包含元组的列表来代替字典。

6

普通的字典不够用,你需要用有序字典。可以看看这些链接:

  1. PEP 372:在集合中添加有序字典
  2. 在Python中使用有序字典作为对象字典 -- 这是一个StackOverflow的问题,证明大家都在用PEP 372的有序字典 :-)
  3. Nicola Larosa和Michael Foord的有序字典模块

如果你想在网上找更多信息,可以搜索“python ordered dictionary”。我记得在StackOverflow上看到过很多关于有序字典的问题,所以如果上面的链接不够用,或许你能在其他问题中找到更好的答案。

更新:Mark建议使用元组列表可能也不错,但命名元组可能更方便:文档中的相关部分。另外,如果你打算对数据进行序列化/反序列化,并且想要速度快,可以看看谷歌的协议缓冲区(有Python工具可用)。

7

我需要保持参数的顺序,也就是说,属性要放在最前面,然后是标签,最后是 reouteDelay。

那么你其实是把事情搞错了顺序——根本不需要使用有序字典!不如试试用一组元组来表示 cache,像这样:

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 一样,而且还能保持你想要的顺序,性能也至少一样好。你现在关注的是“保持字典有序”,但其实你关注的方向是错的(可惜的是,大多数人遇到“有序字典”时都是这样!)。

撰写回答