在Python中以升序插入值到字典?



我有一个获取键和值并将它们添加到字典中的类。我试图插入到字典中,同时保持值的顺序升序。我知道OrderedDict记住键首次插入的顺序,但是想知道如果我想保持字典的值排序,该使用什么。下面是一个例子:

rom collections import OrderedDict
from random import randint

class MyDict():
def __init__(self):
self.d=OrderedDict()
def add(self, key, val):
self.d[key] = val
def show(self):
return self.d
i=1
obj=MyDict()
for _ in range(5):
obj.add(i, randint(1,50))
i+=1
print(obj.show())
OrderedDict([(1, 8), (2, 6), (3, 10), (4, 32), (5, 15)])

然而,我正在寻找这样的东西:

OrderedDict([(2, 6), (1, 8), (3, 10), (5, 15), (4, 32)])

由于从您的注释中可以明显看出,您只需要在输出时对字典进行排序,而不是在一系列插入期间进行排序,因此实际上不需要在每次插入时产生排序的开销,而是可以在顺序重要的方法中添加排序,这可以通过子类化OrderedDict并用优先排序项的方法覆盖所有此类方法来完成。

下面的示例重写了__repr__方法,以便打印对象将产生所需的输出,但是为了完整性,您应该重写所有其他相关方法:

class MyDict(OrderedDict):
def __sorted(self):
sorted_items = sorted(super().items(), key=lambda t: t[::-1])
self.clear()
self.update(sorted_items)
def __repr__(self):
self.__sorted()
return super().__repr__()
# do the same to methods __str__, __iter__, items, keys, values, popitem, etc.

演示:https://replit.com/@blhsing/RudeMurkyIntegrationtesting

由于您希望根据值对字典进行排序

>>> from collections import OrderedDict
>>> from random import randint
>>> 
>>> d = OrderedDict()
>>> 
>>> i=1
>>> for _ in range(5):
...     d[i] = randint(1,50)
...     i+=1
... 
>>> 
>>> sorted(d.items(),key=lambda x:(x[1],x[0]))
[(2, 2), (5, 20), (3, 35), (1, 36), (4, 47)]
>>> 

在这种情况下,可以使用keywithin sorted来根据

的值进行排序

相关内容

  • 没有找到相关文章

最新更新