我想在嵌套列表中为每一行找到最大元素索引。
我得到了这个错误:
maxe = array[i].index(max(e_object.x for e_object in array[i]))
ValueError: 5 is not in list
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)
怎样才能得到这个结果呢?
[3,2]
发布于 2019-04-21 21:13:15
使用list
理解将嵌套的list
转换为x
值之一,然后使用np.argmax
import numpy as np
np.argmax([[element.x for element in row] for row in array], axis=1)
输出:
array([3, 2], dtype=int64)
发布于 2019-04-21 21:13:21
问题出在线路上
maxe = array[i].index(max(e_object.x for e_object in array[i]))
您询问的是object.x
的索引,但该列表实际上包含object
。更改max
函数以查看对象的x
属性
maxe = array[i].index(max(array[i], key=lambda o: o.x))
发布于 2019-04-21 21:24:35
这个错误的发生是因为你的max
有效地在一个整数列表[0, 2, -3, 5]
上操作,而index
在一个e_object
列表中搜索。有很多方法可以解决这个问题。
最简单的方法可能就是让max
返回索引:
max_array = [max(range(len(a)), key=lambda x: a[x].x) for a in array]
这与使用numpy
的argmax
非常相似,但没有繁重的导入和中间内存分配。请注意,这个版本不需要对每个列表传递两次,因为您不会对max
的结果调用index
。
更长期的解决方案是向e_object
类添加适当的比较方法,如__eq__
和__gt__
/__lt__
。
https://stackoverflow.com/questions/55782981
复制相似问题