gpt4 book ai didi

python-3.x - 是否可以交换有序字典的两个键?

转载 作者:行者123 更新时间:2023-12-04 07:56:45 24 4
gpt4 key购买 nike

注意:我使用的是 python 3.8.2,所以字典被认为是有序的
我正在创建一棵二叉树,并使用字典对树进行建模。
例如:{1:[2, 3], 2:[4, 5], 3:[], 4:[], 5:[]}在这个例子中,上面的树看起来像这样:

         1
/ \
2 3
/ \
4 5
我试图模拟一些节点的“上升”,并保持字典的顺序。
我知道使用 myDict[key1], myDict[key2] = myDict[key2], myDict[key1]不会工作,因为 的地方值 改变,而不是 key 。
我也在考虑使用 .popitem()删除最后一个值,直到我在 key1 或 key2 处,然后继续直到我到达另一个键,但这似乎有点困难。有没有其他方法可以做到这一点?

最佳答案

字典,尽管它们现在保持插入顺序,否则不能任意排序。如果你真的想使用字典顺序信息来构建你的树,我认为唯一可靠的方法是为这些交换操作中的每一个创建一个新的字典,复制原始字典的内容。
一个更合理的方法,如果你想要一个任意排序的字典是从 collections.abc.MutableMapping 继承。并使用字典和其他一些数据结构(例如列表)跟踪该对象内的数据。
这听起来可能很复杂,但它可能比你想象的要简单:

from collections.abc import MutableMapping

class SuperOrdered(MutableMapping):
def __init__(self):
self.data = {}
self.order = []
def __setitem__(self, key, value):
if key not in self.data:
self.order.append(key)
self.data[key] = value
def __getitem__(self, key):
return self.data[key]
def __delitem__(self, key):
del self.data[key]
self.order.remove(key)
def __len__(self):
return len(self.data)
def __iter__(self):
yield from iter(self.order)
def replace_key(self, oldkey, newkey, value):
if newkey in self.data:
del self[newkey]
position = self.order.index(oldkey)
self.order[position] = newkey
self.data[newkey] = value
def __repr__(self):
return f"{self.__class__.__name__}({{{', '.join(repr(key) + ':' + repr(self.data[key]) for key in self)}}})"


瞧——映射+“replace_key”方法应该足以让您在思考时构建您的树。
这是上面交互式提示中的类:
In [18]: aa = SuperOrdered()                                                                                             

In [19]: aa["a"] = 1;aa["b"] = 2;aa["c"] = 3

In [20]: aa
Out[20]: SuperOrdered({'a':1, 'b':2, 'c':3})

In [21]: aa.replace_key("a", "d", 4)

In [22]: aa
Out[22]: SuperOrdered({'d':4, 'b':2, 'c':3})
除了这个答案,主题之外:如果你想检查一个我希望“生产就绪”的树实现,我已经发布了一个作为我 extradict 的一部分包(pip 可安装)。
更新 : 也可能继承自 collections.OrderedDict并添加一个 replace_key方法在那里。该代码必须处理 OrderedDict 内部结构,但这并不难。
外部链接:
Github modification

关于python-3.x - 是否可以交换有序字典的两个键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66661656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com