我希望能够在全球范围内订购字典。
我经常发现自己编写这样的代码:
things_to_evaluate = {
'thing 1': lambda: Thing(property = 'a'),
'thing 2': lambda: Thing(property = 'b'),
...
}
...
for k, v in things_to_evaluate.iteritems():
thing = v()
result[k] = thing.process(something)
就我而言,字典语法是指定我想尝试的一堆实验的便捷方式。现在,我希望实际上按照我指定的顺序显示结果。
我知道这是一件非常糟糕的事情,我知道散列和无序集合以及OrderedDict和一切的存在。
但是,如果我可以选择仅仅为了我自己的方便,使用一行代码,覆盖一些原始函数并使其成为所有dicts的顺序,结果会很糟糕。
那么,有没有人知道这样做的方法?
答案 0 :(得分:5)
你不能这样做,至少不是没有将源代码破解到你喜欢的Python实现并重建它。 (而且,如果你最喜欢的实现是CPython,这将是一项大量的工作,因为OrderedDict
不仅没有内置,它甚至没有C实现 - 尽管这可能会改变在3.5。)
当然,您可以将名称dict
重新绑定到collections.OrderedDict
,无论是全局(在您的模块中)还是超全局(在内置内),但这不会影响文字字典显示,字典理解,返回字典的内置代码(包括构造类和对象type
的{{1}}函数和处理__dict__
的解释器代码等)< / p>
你可以创建自己编写**kwargs
显示和理解的方式,并使用带有AST转换器的导入钩子将它们转换为对OrderedDict
构造函数的调用。我相信OrderedDict
显示是MacroPy
附带的示例之一,并且它也不应该太难以扩展以便处理理解。但是如果没有这样的话,你最好做的就是:
OrderedDict
......或:
from collections import OrderedDict as o
things_to_evaluate = o(
('thing 1', lambda: Thing(property = 'a')),
('thing 2', lambda: Thing(property = 'b')),
...
)
答案 1 :(得分:2)
如果订单很重要,请使用列表而不是字典。您可能根本不需要密钥!
如果确实需要密钥,可以使列表包含2元组(键值对)。 list和tuple literal语法可以为您完成此操作,而不会破坏系统内部:
things_to_evaluate = [
('thing 1', lambda: Thing(property = 'a')),
('thing 2', lambda: Thing(property = 'b')),
...
]
...
for k, v in things_to_evaluate:
thing = v()
result.append((k, thing.process(something)))