全局排序Python词典

2024-04-23 17:29:32 发布

您现在位置: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和一切。你知道吗

尽管如此,如果我能选择仅仅为了我自己的方便,用一行代码,重写一些原始函数,并使它所有的dict都是有序的,那就太好了。你知道吗

有人知道怎么做吗?你知道吗


Tags: tolambda代码inforpropertyresultprocess
2条回答

你不可能做到这一点,至少不把源代码修改成你最喜欢的Python实现并重建它。(而且,如果您最喜欢的实现是CPython,那么这将是一个巨大的工作量,因为OrderedDict不仅不是内置的,而且它甚至没有C实现,尽管这在3.5中可能会改变。)

当然,您可以将名称dict重新绑定到collections.OrderedDict,可以是全局性的(在您的模块中)或超全局性的(在内置中),但这不会影响文本字典的显示、字典的理解,返回字典的内置代码(包括构建类和对象的type函数__dict__和处理**kwargs的解释器代码等)

您可以发明自己的方式来编写OrderedDict显示和理解,并使用带有AST转换器的导入钩子将它们转换为对OrderedDict构造函数的调用。我相信OrderedDict显示是^{}附带的示例之一,扩展它来处理理解也不太难。但如果没有这样的东西,你最好的办法是:

from collections import OrderedDict as o

things_to_evaluate = o(
    ('thing 1', lambda: Thing(property = 'a')), 
    ('thing 2', lambda: Thing(property = 'b')), 
    ...
    )

…或:

def o(*args):
    return OrderedDict(zip(args[::2], args[1::2]))

things_to_evaluate = o(
    'thing 1', lambda: Thing(property = 'a'),
    'thing 2', lambda: Thing(property = 'b'),
    ...
    )

如果顺序很重要,使用列表而不是字典。你可能根本不需要钥匙!你知道吗

如果确实需要密钥,可以使列表包含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)))

相关问题 更多 >