#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]