将对象列表与自定义键进行比较

Posted

技术标签:

【中文标题】将对象列表与自定义键进行比较【英文标题】:Comparing lists of objects with custom key 【发布时间】:2015-10-23 10:21:31 【问题描述】:

我根据对象的一个​​属性对一些对象进行排序,使用如下:

sorted_list = sorted(unsorted_list, key=lambda x: x.my_attr)

有没有办法对这些对象的列表进行排序,就像 Python 可以对整数列表进行排序一样?我可以为这些对象重载__cmp__(self, other),但这会给外部包带来困难。嵌套也可能变得任意深,所以我认为我不能只使用列表推导。

我想知道是否可以生成my_attrs 列表并将其链接到相应的对象列表。我想不出一个很好的方法来临时做。

【问题讨论】:

您能否展示嵌套列表的示例,也许有更好的方法可以在不生成my_attr 列表的情况下做到这一点。 ?还包括预期输出 [[340 N N, 338 C C], [344 C CB, 350 C CG1], [357 C C, 358 O O], [343 H HA]] 这是第一级递归的一个例子。对象是原子,我想做的是根据Cahn Ingold Prelog rules 进行排序。导致嵌套的是第 2 步中的扩展,我使用的属性是原子的原子序数。 你应该edit你的问题并添加。 您是要对每个列表中的原子进行排序,还是要对包含原子的列表的顺序进行排序? 您解释了重载“__cmp__”有什么问题。但是您给出的示例行有什么问题?您是否要在比较中考虑多个属性?然后,不是将键传递给 sorted(),而是传递一个比较函数,作为参数 cmp。 【参考方案1】:

您可以在您的数据类型上实现比较函数,然后依赖 Python 的排序函数。

查看类似问题和答案:Python: Sort custom class without use of `key` argument?

简而言之,您可以使用total_ordering 元类并实现__eq____lt__ 函数。

在您的具体情况下,您可以像这样实现__eq__

def __eq__(self, other):
    return self.my_attr == other.my_attr

__lt__ 也是如此。

【讨论】:

以上是关于将对象列表与自定义键进行比较的主要内容,如果未能解决你的问题,请参考以下文章

将枚举与自定义 Fluent 断言等效步骤进行比较

如何将两组与自定义数据类型进行比较

NSDictionary 与自定义对象

Alamofire.request 不与自定义对象映射

为啥将 std::sort 与自定义比较器一起使用无法编译?

GTK+ 3.0:如何将 Gtk.TreeStore 与自定义模型项一起使用?