首页 > 解决方案 > 当值是对象时,如何对python字典中的对象进行排序?

问题描述

我有一个看起来像这样的python dict:

file_dict = {'a.txt' : <#:text_object>, 'b.txt': <#:text_object>, 'c.txt': <#:text_object>}

值 text_object 是一个包含一堆关于文件的分析数据的对象。就是这样的物体...

class text_object:
     #...a bunch of methods and setters...
     def get_word_count(self):
          return self.word_count #integer value

这些对象在一个字典中,这样我就可以通过它们的文件名快速找到特定的文件及其相应的数据。我想按 word_count 顺序对 file_dict 进行排序,以便输出字数最少的对象,以帮助发现数据收集过程中的异常情况。

如何根据存储在其中的 text_object.get_word_count() 类中的值对 file_dict 进行排序?

标签: pythonpython-3.xsorting

解决方案


我相信这可以解决问题,但是如果没有您的实际字典和对象,我将无法对其进行测试。我建议提供您的数据样本。

sorted_keys = sorted(file_dict, key=lambda k: file_dict[k].get_word_count())
sorted_file_dict = {k: file_dict[k] for k in sorted_keys}

此外,“排序”字典有点不必要。重点是可以通过哈希表查找对象,从而无需任何排序。如果您在迭代时想要某种排序,那么您可以迭代已排序的键。但在大多数情况下,字典本身并不真正需要排序。

关闭编辑:我不同意将其关闭为重复项,因为__lt__text_object该类实现仍然无法帮助您对text_object实例字典进行排序。另外,请注意,类名通常是 CamelCase,考虑重命名text_objectTextObject.

寻址__lt__()

由于这个问题可能不会被重新打开,我将讨论 OP 如何使用副本中的信息。老实说,最终产品并没有太大区别,但无论如何实施它可能不是最糟糕的主意:

class TextObject:
    # attributes and methods, etc
    def get_word_count(self):
        return self.word_count

    def __lt__(self, other):
        return self.get_word_count() < other.get_word_count()

然后,为了“排序”你的字典:

sorted_keys = sorted(file_dict, key=lambda k: file_dict[k])
sorted_file_dict = {k: file_dict[k] for k in sorted_keys}

请注意,唯一的区别是sorted()key 函数不再直接调用TextObject.get_word_count().

正如其他人所提到的,如果您打算执行类似some_text_object < other_text_object.

PS - 你可能想看看@property装饰器。


推荐阅读