【问题标题】:Return sorted objects of type of a class in a dictionary in Python?在Python的字典中返回类类型的排序对象?
【发布时间】:2021-07-24 03:21:19
【问题描述】:

我在这里有两个类,我在类 Store 的字典中添加类 Info 类型的对象。

from collections import defaultdict
from random import randint
import numpy as np

class Info:
    def __init__(self, grade, age):
        self.grade = grade
        self.age = age

class Store:
    def __init__(self):
        self.d = defaultdict(dict)

    def add_obj(self, name, obj):
        self.d[name] = obj

    def return_val(self):
        "return by sorted age desc"
        return self.d

obj = Store()
for _ in range(3):
    name = chr(np.random.randint(ord('a'), ord('z')))
    info = Info(grade = randint(1, 5), age = randint(7, 12))
    obj.add_obj(name, info)

print(obj.return_val())

我要做的是在 return_val 方法中按年龄的降序返回创建的字典。有什么办法吗?

【问题讨论】:

  • 字典按插入顺序排序。如果您想要真正可排序的东西,请使用列表。你期待什么输出,究竟是什么?你实际尝试过什么?它是如何失败的?
  • 没有。字典按字母顺序存储。 “collections.OrderedDict”按它们创建的顺序存储。如果您需要自定义顺序,请将键拉入列表,对列表进行排序,然后返回列表和字典。
  • @TimRoberts 自 Python 3.7+(以及 3.6 作为实现细节)以来,dict 对象保持插入顺序。他们从来没有保持字母顺序..

标签: python dictionary oop


【解决方案1】:

如果你使用 Python 3.7+,你可以这样做:

    def return_val(self):
        "return by sorted age desc"
        return dict(
            (key, self.d[key])
            for key in sorted(
                self.d.keys(), key=lambda k: self.d[k].age, reverse=True
            )
        )

如果没有,则使用collections.OrderedDict:

from collections import OrderedDict
...
    def return_val(self):
        "return by sorted age desc"
        return OrderedDict(...

Info 类中添加__repr__

    def __repr__(self):
        return f"(grade={self.grade}, age={self.age})"

输出如下:

{'l': (grade=2, age=11), 't': (grade=2, age=8), 'o': (grade=2, age=7)}

【讨论】:

    【解决方案2】:

    你可以用现有的代码做你想做的事,但正如其他人所说,可能有更好的方法来做。

        def return_val(self):
          return sorted(self.d.items(), key=lambda kv: kv[1].age, reverse=True)
    

    这将返回一个列表,这里有一些代码可以用示例输出打印它。

    for item in obj.return_val():
        print(f'name:{item[0]}, grade:{item[1].grade}, age:{item[1].age}')
    
    """
    name:s, grade:2, age:12
    name:x, grade:5, age:10
    name:o, grade:5, age:8
    """
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-17
      • 2011-12-24
      • 2017-12-17
      • 2020-05-22
      • 2021-03-31
      • 2019-08-11
      • 2013-10-30
      • 2018-07-08
      相关资源
      最近更新 更多