将对象列表与自定义键进行比较
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_attr
s 列表并将其链接到相应的对象列表。我想不出一个很好的方法来临时做。
【问题讨论】:
您能否展示嵌套列表的示例,也许有更好的方法可以在不生成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__
也是如此。
【讨论】:
以上是关于将对象列表与自定义键进行比较的主要内容,如果未能解决你的问题,请参考以下文章