Нахождение индекса самого высокого элемента из списка списка - PullRequest
0 голосов
/ 15 ноября 2018

Это список, с которым я имею дело.Значение:

[[0.25, 0.0, 0.0, 0.0, 0.0, 0.0, 0.94, 0.0, 0.0, 0.63, 0.0],
     [0.51, 0.51],
     [0.54, 0.54, 0.0, 0.0,0.63,  0.0, 0.51, 0.54, 0.51, 1.0, 0.51],
     [0.81,0.05, 0.13, 0.7, 0.02]]

Я пытался найти, какое наибольшее значение принадлежит какому списку.Здесь самое высокое значение равно 1 и оно находится в третьем списке.т.е. индекс 2. Как это получить?

maxval=[]
maxval1=[]
for i in range(0,len(Value)):
        maxval1.append(max(Value[i]))
maxval.append(max(maxval1))


maxval1
Out[220]: [0.94, 0.51, 1.0, 0.81]

maxval
Out[221]: [1.0]

index=[]
index1=[]
for i in range(0,len(Value)):
        index1.append(Value[i].index(maxval))

выдает ошибку: ValueError: [1.0] is not in list

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Вы можете решить эту проблему, используя библиотеку Python pandas. Решение становится действительно простым:

Создайте dataframe (df) из вашего списка:

In [2040]: df = pd.DataFrame(Value)

In [2041]: df
Out[2041]: 
     0     1     2    3     4    5     6     7     8     9     10
0  0.25  0.00  0.00  0.0  0.00  0.0  0.94  0.00  0.00  0.63  0.00
1  0.51  0.51   NaN  NaN   NaN  NaN   NaN   NaN   NaN   NaN   NaN
2  0.54  0.54  0.00  0.0  0.63  0.0  0.51  0.54  0.51  1.00  0.51
3  0.81  0.05  0.13  0.7  0.02  NaN   NaN   NaN   NaN   NaN   NaN

Теперь просто найдите максимум в каждом ряду:

In [2047]: df.max(axis = 1)
Out[2047]: 
0    0.94
1    0.51
2    1.00
3    0.81

Вы можете увидеть max всех строк.

Теперь найдите значение max из приведенного выше. Это будет максимум всего Dataframe.

In [2048]: df.max(axis = 1).max()
Out[2048]: 1.0

Чтобы найти индекс этого значения:

1-строчное решение:

In [2082]: pd.DataFrame(Value).max(axis = 1).idxmax()
Out[2082]: 2

Дайте мне знать, если это поможет.

0 голосов
/ 15 ноября 2018

Вы также можете сделать это как однострочное:

data = [[0.25, 0.0, 0.0, 0.0, 0.0, 0.0, 0.94, 0.0, 0.0, 0.63, 0.0],
        [0.51, 0.51],
        [0.54, 0.54, 0.0, 0.0,0.63,  0.0, 0.51, 0.54, 0.51, 1.0, 0.51],
        [0.81,0.05, 0.13, 0.7, 0.02]]

# iL === innerList, abbreviated for 79 chars line width
max_idx, max_value = max( enumerate(max(iL) for iL in data), key = lambda x:x[1])

print(max_idx)

Вывод:

2  # max_value == 1, but not printed

Хитрость заключается в том, чтобы получить max(..) каждого внутреннего списка, enumerate() те и использовать другой max(iterable, key=...), который имеет key, который выбирает самое высокое значение (не позиция) из перечислимого кортежа (position,value).

Преимущество - при этом используются генераторы :

вы не создаете никаких промежуточных списков, но просто работаете с генераторами - для больших списков это гораздо большепамяти, а затем создает список, как infiQuanta делает.

0 голосов
/ 15 ноября 2018

Вы ищете максимальное значение в каждом списке, но оно присутствует только в третьем списке, будет выброшено ValueError для всех остальных списков, если максимальное значение не присутствует в самом первом списке.

Это можно сделать просто так

max_list = list()
for i, sub_list in enumerate(Value):
    max_list.append((max(sub_list), i))

index_of_max = max(max_list)[1]

index_of_max обеспечивает индекс списка, содержащего максимальное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...