【问题标题】:How do I sort objects in a python dictionary when the value is an object? [duplicate]当值是对象时,如何对python字典中的对象进行排序? [复制]
【发布时间】:2021-10-27 12:46:09
【问题描述】:

我有一个看起来像这样的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 进行排序?

【问题讨论】:

  • 实现__lt__ 方法以使python排序工具工作。我认为这是stackoverflow.com/questions/7152497/… 的重复
  • 链接为重复的问题是有问题的。当sorted 可以接受key 参数时,为什么要实现__lt__
  • 我也不同意关闭,因为为text_object 类实现__lt__ 仍然无助于对字典本身进行排序。
  • @stef - 当您控制类的定义并希望使其可排序时,__lt_ 比在您想要排序的任何地方重复排序逻辑要好。除了排序之外,它还可以对对象进行其他比较。我认为 OP 希望 .get_word_count() 成为该类的规范排序值。如果事实证明 OP 在这种特殊情况下只是想要这种排序行为,他可以在 cmets 中提到这一点,然后我们可以删除 dup。
  • 伙计们,我已经阅读了重复的答案,但实际上并没有太多的答案。我不了解您的标准,因为其他相关问题甚至没有在他们的问题中提供可靠的代码示例。我让管理员删除了一个问题,因为问题中没有代码。如何从替代答案中实现 lt 方法也不是很清楚。我认为我的问题会增加 Stack Overflow 的价值,所以请您考虑回答。

标签: python python-3.x sorting


【解决方案1】:

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

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}

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

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

寻址__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() 键函数不再直接调用TextObject.get_word_count()

正如其他人所提到的,如果您打算执行some_text_object &lt; other_text_object 之类的操作,此方法可能是您的理想选择。

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

【讨论】:

  • 我认为应该是.get_word_count() 而不仅仅是.get_word_count
  • 这是一个很好的替代方法,可以通过__lt__ 方法使类本身可排序。这是一个关于这个类多久需要排序的问题。
  • 是的。我正在考虑将函数引用传递给key 参数lol。
猜你喜欢
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 2013-02-24
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
相关资源
最近更新 更多