【问题标题】:How to make class data sortable如何使类数据可排序
【发布时间】:2013-06-06 06:21:42
【问题描述】:

这肯定是重复的,但假设我有一个类如下:

class MyObj(object):
    def __init__(self, *args, **kwargs):
        self._data = [2, 1, 3]
        self._more_data = [False, True, False]

如何使其可排序,而不是针对其他 MyObj 对象(我可以使用 __lt__),而是在内部?所以如果我打电话给sorted(my_obj_instance),我会得到一个带有如下数据的版本:

self._data = [1,2,3]
self._more_data [True, False, False]

即_data是按数值排序的,_more_data已经对应排序了。

【问题讨论】:

    标签: python sorting


    【解决方案1】:

    sorted()从不修改原始数据。要使其与自定义对象一起使用,您必须实现__iter__(返回例如iter(self._data)) - 但这只会为您提供该对象的排序版本,既不会修改原始对象,也不会对两个列表进行排序。

    您想要的是一个 sort() 方法,您可以将其称为 yourobj.sort()。然后,此方法将调用列表上的 .sort(),并使用适当的 key 参数来表示您希望它们排序的方式。

    【讨论】:

    • 如果“排序”顺序更重要 - 那么我想知道 OP 是否应该重新考虑数据结构并将这些项目保留在其他东西中......但是是的 +1
    • 是的,这个例子只是为了说明对自定义排序方法的需求,谢谢。
    【解决方案2】:

    你不能让sorted 返回你的类的实例。 sorted 总是返回一个列表。如果您将其设为an iterator,您可以获得sorted 以返回您班级数据的排序版本(作为列表)。但是给你的类一个名为sort的方法可能更简单,它可以对它的数据进行排序。

    【讨论】:

      【解决方案3】:

      您可以像这样定义sort 方法

      def sort(self)
          self._data, self._more_data = zip(*sorted(zip(self._data, self._more_data)))
      

      这会将两个属性压缩成 2 元组。对 2 元组列表进行排序并再次解压缩它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-05
        • 2013-12-14
        • 2012-09-17
        • 2012-06-16
        • 2013-09-27
        • 1970-01-01
        • 2015-02-02
        • 2012-06-14
        相关资源
        最近更新 更多