全局制作有序的Python词典

时间:2014-11-19 01:41:41

标签: python

我希望能够在全球范围内订购字典。

我经常发现自己编写这样的代码:

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的顺序,结果会很糟糕。

那么,有没有人知道这样做的方法?

2 个答案:

答案 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)))