如何在Python中保持字典参数顺序?
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
普通的字典不够用,你需要用有序字典。可以看看这些链接:
- PEP 372:在集合中添加有序字典
- 在Python中使用有序字典作为对象字典 -- 这是一个StackOverflow的问题,证明大家都在用PEP 372的有序字典 :-)
- 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
一样,而且还能保持你想要的顺序,性能也至少一样好。你现在关注的是“保持字典有序”,但其实你关注的方向是错的(可惜的是,大多数人遇到“有序字典”时都是这样!)。