首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在由类对象组成的列表中找到特定值的最大元素索引?

如何在由类对象组成的列表中找到特定值的最大元素索引?
EN

Stack Overflow用户
提问于 2019-04-21 21:05:39
回答 3查看 50关注 0票数 1

我想在嵌套列表中为每一行找到最大元素索引。

我得到了这个错误:

代码语言:javascript
复制
maxe = array[i].index(max(e_object.x for e_object in array[i]))
ValueError: 5 is not in list
代码语言:javascript
复制
class e_object():
    def __init__(self,x):
        self.x = x

array = []
array.append( [])
array[0].append(e_object(0))
array[0].append(e_object(2))
array[0].append(e_object(-3))
array[0].append(e_object(5))

array.append( [])
array[1].append(e_object(0))
array[1].append(e_object(2))
array[1].append(e_object(8))
array[1].append(e_object(5))

max_array = []
for i in range(len(array)):
    maxe = array[i].index(max(e_object.x for e_object in array[i]))
    max_array.append(maxe)

print(max_array)

怎样才能得到这个结果呢?

代码语言:javascript
复制
[3,2]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-21 21:13:15

使用list理解将嵌套的list转换为x值之一,然后使用np.argmax

代码语言:javascript
复制
import numpy as np

np.argmax([[element.x for element in row] for row in array], axis=1)

输出:

代码语言:javascript
复制
array([3, 2], dtype=int64)
票数 1
EN

Stack Overflow用户

发布于 2019-04-21 21:13:21

问题出在线路上

代码语言:javascript
复制
maxe = array[i].index(max(e_object.x for e_object in array[i]))

您询问的是object.x的索引,但该列表实际上包含object。更改max函数以查看对象的x属性

代码语言:javascript
复制
maxe = array[i].index(max(array[i], key=lambda o: o.x))
票数 1
EN

Stack Overflow用户

发布于 2019-04-21 21:24:35

这个错误的发生是因为你的max有效地在一个整数列表[0, 2, -3, 5]上操作,而index在一个e_object列表中搜索。有很多方法可以解决这个问题。

最简单的方法可能就是让max返回索引:

代码语言:javascript
复制
max_array = [max(range(len(a)), key=lambda x: a[x].x) for a in array]

这与使用numpyargmax非常相似,但没有繁重的导入和中间内存分配。请注意,这个版本不需要对每个列表传递两次,因为您不会对max的结果调用index

更长期的解决方案是向e_object类添加适当的比较方法,如__eq____gt__/__lt__

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55782981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档