首页 > 解决方案 > 在python中初始化orderdict

问题描述

我是 Python 新手。

我正在尝试创建很多ordereddict,但是因为我以混乱的顺序填写它,所以我必须创建一个函数来传递正常的 dict 以获得我想要的顺序。

info = dict()
info['age'] = 3
...

keys=['id','name','age','ck_id','image']
def fix_order(my_dict):
    new_queue = OrderedDict()
    for k in keys:
        new_queue[k] = item[k]
    return new_queue

我想要做的是创建一个简单的类,无论填充顺序如何,它都已经具有我想要的顺序。

我检查了这个问题How to create an OrderedDict in Python? ,但这假设我有第一手的价值观。

即我想要info = my_dict()的#已经有内置的序列(顺序)

标签: pythondictionary

解决方案


据我了解,您希望拥有一个数据结构,可以为您提供与 dict 相同的操作,但如果迭代会以精确的顺​​序提供项目。

如果是这种情况,您可以覆盖给出可迭代对象的方法:__iter__方法、key方法、values方法和items方法(也许还有其他我不记得的方法)

有一个基础课程你可以开始。(即这只会迭代您指定的元素,但可能您也想扩展以迭代其他元素)

from collections import UserDict

class MyDict(UserDict):
    def __init__(self, *args, **kwargs):
        self.order = kwargs.pop('order')
        super().__init__(*args)
    def change_order(self, order: list):
        self.order = order

    def __iter__(self):
        for key in self.order:
            if key in self:
                yield key

    def keys(self):
        for key in self.order:
            if key in self:
                yield key

    def values(self):
        for key in self.order:
            if key in self:
                yield self[key]

    def items(self):
        for key in self.order:
            if key in self:
                yield key, self[key]

有一个测试:

d = MyDict({"b" : 2, "c": 3, "a": 1}, order=["a","b","c"])
print(d)

for k in d:
    print(k, end=" ")
#a b c
print()

for k in d.keys():
    print(k, end=" ")
#a b c
print()

for v in d.values():
    print(v, end=" ")
#1 2 3
print()

for k, v in d.items():
    print(f"{k}-{v}", end=" ")
#a-1 b-2 c-3

您可以覆盖__repr__并且__str__如果您希望您的字典也按照您想要的顺序转换为字符串(并打印)


推荐阅读