如何更新有序字典(OrderedDict)中特定位置的值?

5

如何在特定位置(从0开始)更新OrderedDict的值?

od = OrderedDict(a=1, b=2, c=3)
od.update({'b': 4}) # a=1, b=4, c=3
od.update_values(2, 1)  # a=2, b=1, c=3

2
请注意,以这种方式初始化您的OrderedDict 不能保证它们按照a、b、c的顺序插入。 - jedwards
@jedwards 哦,谢谢你的信息 :) 我不知道。 - Skamah One
1
是的:OrderedDict构造函数和update()方法都接受关键字参数,但它们的顺序会丢失,因为Python的函数调用语义使用常规无序字典传递关键字参数。文档 - jedwards
为了避免这种情况,你可以传入一个元组列表。例如 OrderedDict([('a', 1), ('b', 2)]) 或者 OrderedDict(zip(['a', 'b', 'c'], [1, 2, 3])) - Iskar Jarak
2个回答

5
这很简单 - 只需使用od[od.keys()[x]] = y 这也适用于字典(尽管没有意义)。该代码仅获取有序字典键的list,然后从列表中获取所需位置的条目,然后将该字符串用作原始有序字典的键。

谢谢!比我想象的要容易 :D - Skamah One
嗯,Python 经常是这样的,特别是在使用 lambda 和列表推导式时。如果这个回答解决了你的问题,请将其标记为已接受的答案。 - humanoid
1
对于Python 3中使用生成器的.keys(),请使用od[list(od.keys())[x]] = y - JBWKy

1
您可以原地更新有序字典中的现有元素,而不更改顺序:
>>> od=MyOD(zip(['a', 'b', 'c'], [1, 2, 3]))
>>> for i, k in enumerate(od):
...    if i==1:
...        od[k]=1
... 
>>> od
OrderedDict([('a', 1), ('b', 1), ('c', 3)])

如果您想要一种方法来实现这个,只需子类化OrderedDict:
class MyOD(OrderedDict):
    def update_pos(self, pos, val):
        for i, k in enumerate(self):
            if i==pos:
                self[k]=val
                return

>>> od=MyOD(zip(['a', 'b', 'c'], [1, 2, 3]))
>>> od
MyOD([('a', 1), ('b', 2), ('c', 3)])
>>> od.update_pos(1, 22)
>>> od
MyOD([('a', 1), ('b', 22), ('c', 3)])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接