[英]Make ordered dict default?
是否可以使用默認字典文字來創建有序字典而不是無序字典?
我想輸入復雜的嵌套配置,例如:
config = {
'train': {
'speed': 0.001,
'initial_values': [1, 2, 3]
},
'model': {
...
}
}
和寫一堆括號的想法
config = OrderedDict([(
'train', OrderedDict([(
'speed', 0.001), (
'initial_values', [1, 2, 3])]),(
'model', OrderedDict([(
...
絕對不適用。
請不要為我的願望為什么不好而生疏。
好吧,目前我會寫一些東西:
def od(*args):
return OrderedDict([(args[i], args[i+1]) for i in range(0, len(args), 2)])
config = od(
'train', od(
'speed', 0.001,
'initial_values', [1, 2, 3]
),
'model', od(
...
)
)
不,您不能更改Python語法,不能不更改CPython源代碼並重新編譯,但是那樣就不再是Python。
最好的辦法是升級到Python 3.6或更高版本 , 默認情況下字典將保留插入順序 。 如果必須具有完整的OrderedDict
功能集(重新排序,反轉,帶排序的dict視圖),請在發生以下情況后將這些常規詞典轉換為OrderedDict
對象:
from collections import OrderedDict
from functools import singledispatch
@singledispatch
def to_ordered_dict(d):
"""Convert dictionaries to OrderedDict objects, recursively
Assumes you want to use current dictionary iteration order; in Python 3.7
and newer that's the same as insertion order (or earlier if on PyPy, or
when using CPython, 3.6 and newer).
"""
return d
@to_ordered_dict.register(dict)
def _dict(d):
return OrderedDict(
(to_ordered_dict(k), to_ordered_dict(v))
for k, v in d.items()
)
@to_ordered_dict.register(list)
@to_ordered_dict.register(tuple)
def _sequence(s):
return type(s)(map(to_ordered_dict, s))
# add additional type registrations for other compound or container types
然后堅持使用{...}
表示法,最后使用config = to_ordered_dict(config)
行。
出於哲學上的原因,您不應該這樣做,但是您可能無法通過更改基本的Python語法來做到這一點。 如其他地方所述,Python字典可以在3.6之后保留順序,但是如果必須使用OrderedDict
d = OrderedDict
config = d([(...)])
您可以使用.update
方法執行相同.update
盡管這並不能按照您所說的方式直接回答您的問題,但我想您確實希望能夠處理一些配置。 我通常更喜歡將配置保存在python文件中,而不是以某種結構化數據格式保存。 因此,如果您可以使用json,則可以執行以下操作。
from collections import OrderedDict
import json
result = json.loads(
'''
{
"train": {
"speed": 0.001,
"initial_values": [1, 2, 3]
},
"model": {
"name": "model_name",
"wheight" : 128000
}
}
''',
object_pairs_hook=lambda pairs: OrderedDict(pairs))
即使在python 2.7中也應如此。
如果您有專用的配置文件,則可以執行以下操作
from collections import OrderedDict
import json
with open('settings.conf', 'r') as f:
settings_str = f.read()
settings = json.loads(settings_str, object_pairs_hook=lambda pairs: OrderedDict(pairs))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.