按numpy数组字段对对象列表进行排序?

3
我有一个类,其中有一个字段是numpy数组。该类的实例在列表中。我想按照这些数组对列表进行排序。我该如何做到这一点?
简化版:
class DataObject:
  def __init__(self, location):
    self.loc = location

do1 = DataObject(array([4.0, 5.0, 6.0]))
do2 = DataObject(array([1.0, 2.0, 3.0]))
do3 = DataObject(array([1.0, 8.0, 9.0]))
dos = [do1, do2, do3]

sorted_dos = awesome_sort(dos)

我希望sorted_dos里的排序顺序为do2、do3和do1。

如何在不更改DataObject的情况下,优雅且无bug地实现awesome_sort()呢?

1个回答

2
尝试使用内置的sorted函数。你可以传递一个key参数告诉它如何对列表进行排序。
sorted(dos, key=lambda x: tuple(x.loc))

这将按照数组的第一个值进行升序排序。如果第一个元素相等,则会检查第二个元素。


这段代码会按照我的预期对数组进行排序吗?我没有用数组制作出一个最小的工作示例。我尝试了 a1 = array([1.0, 5.0, 0.0]); a2 = array([1.0, 8.0, 9.0]); a3 = array([1.0, 5.0, 9.0]); a = [a1, a2, a3]; sorted(a) - Make42
我刚刚进行了一个小修复。你需要将 tuple 包裹在 x.loc 周围。 - James
另外,如果您想查看对象的位置,可以添加def __repr__(self): return "<DataObject loc: {}, {}, {}>".format(*self.loc) - James
这是否与Java/Scala中的toString()相同? - Make42
它们是相似的。__repr__ 方法决定了在对象被引用输出时显示的内容。__str__方法决定了当对象从 strprint 调用时显示的内容。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接