Как я могу сделать выбор наибольшего числа более компактным с помощью python?

#python #arrays #sorting #optimization #coding-style

Вопрос:

У меня есть этот код,в котором у меня есть массив размеров (i, j), и для каждой из переменных j я хочу выбрать самую высокую из переменных I.

Например, у меня есть массив [[2,5,1][12,4,6],[1,7,8],[2,4,5]] и я хочу получить наибольшее число из каждого внутреннего массива, чтобы оно возвращало: [5,12,8,5]

У меня есть следующий код, который отлично работает, однако он немного запутан и труден для чтения, поэтому мой вопрос в том, могу ли я сделать его более компактным?

Вот код, который у меня есть:

 high_net_profit = list()
for i in range(len(self.accum_profit[0])):
    high_value = 0
    for j in range((len(self.accum_profit))):
        if j == 0:
            high_value = self.accum_profit[j][i]
        else:
            if self.accum_profit[j][i] > high_value: high_value = self.accum_profit[j][i]
    high_net_profit.append(high_value)
 

Ответ №1:

Попробуй:

 lst = [[2, 5, 1], [12, 4, 6], [1, 7, 8], [2, 4, 5]]

out = [max(l) for l in lst]
print(out)
 

С принтами:

 [5, 12, 8, 5]
 

Или:

 out = [*map(max, lst)]
print(out)
 

Комментарии:

1. Не могли бы вы привести пример этого, если бы массив был транспонирован? например, из вашего примера [[2,12,1,2],[5,4,7,4],[1,6,8,5]] и я хотел получить результат [12,7,8]

2. @HubertRzeminski В моем примере я перебираю подсписки [[2,12,1,2],[5,4,7,4],[1,6,8,5]] и для каждого подсписка нахожу максимум с max() функцией. Так 12 что за [2,12,1,2] , 7 за [5,4,7,4] и 8 за [1, 6, 8, 5] . Таким образом, в результате получается [12, 7, 8]

3. @HubertRzeminski — [max(l[i] for l in lst) for i in range(len(lst[0]))] .

Ответ №2:

 s =  [[2,5,1][12,4,6],[1,7,8],[2,4,5]]
 

Если вам просто нужен повторяющийся объект:

 x = map(max, s)
 

Если вам нужен список, то заверните в list :

 x = list(map(max, s))
 

Ответ №3:

Вот простое решение с использованием numpy. Numpy-очень полезная библиотека при работе с числами:

 import numpy as np

l_in = [[2, 5, 1], [12, 4, 6], [1, 7, 8], [2, 4, 5]]

# out = [max(l) for l in l_in]  # can also be used
out = list(np.max(l_in, axis=1))

print(out)
 

Выход:

 [5, 12, 8, 5]