Как найти максимальный индекс элемента для определенного значения в списке, состоящем из объектов класса? - PullRequest
1 голос
/ 21 апреля 2019

Я хочу найти максимальный индекс элементов во вложенном списке для каждой строки.

Я получил эту ошибку:

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]

Ответы [ 3 ]

1 голос
/ 21 апреля 2019

Проблема в строке

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))
1 голос
/ 21 апреля 2019

Ошибка возникает потому, что ваш 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 's argmax, но без интенсивного импорта и промежуточных выделений памяти.Обратите внимание, что эта версия не требует двух проходов по каждому списку, так как вы не вызываете index по результату max.

Более долгосрочным решением было бы добавить соответствующие методы сравнения, например__eq__ и __gt__ / __lt__ до e_object класса.

1 голос
/ 21 апреля 2019

Используйте понимание 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)
...