У меня есть список C11, содержащий много подсписков. Я хочу найти максимальный элемент каждого подсписка. Я представляю текущие и ожидаемые результаты.
C11 = [[[353.856161, 0.0, 0.0], [0.0, 0.0, 282.754301, 0.0]], [[0.0, 294.983702, 126.991664]]]
for i in range(0,len(C11)):
C2 = max(C11[i])
print(C2)
Текущий выход
[[353.856161, 0.0, 0.0], [0.0, 294.983702, 126.991664]]
Ожидаемый результат:
[[[353.856161],[282.754301]], [[294.983702]]]
Да, глубина списка будет случайной, как показано выше. Было бы здорово иметь более общий код.






Понимание списка
Код:-
C11=[[[353.856161, 0.0, 0.0], [0.0, 0.0, 282.754301, 0.0]], [[0.0, 294.983702, 126.991664]]]
res=[[[max(sublist)] for sublist in lis] for lis in C11]
print(res)
Выход:
[[[353.856161], [282.754301]], [[294.983702]]]
Это предполагает только два уровня вложенности...
можете ли вы предложить, что я должен отредактировать в этом понимании списка ... или с помощью понимания списка это невозможно сделать? @Tomerikoo
Я не могу придумать способ использования циклов, так как вам придется буквально писать циклы, но вы не можете знать заранее, сколько вам понадобится... Может быть, как-то с циклом while, но тогда это не может быть понимание списка
спасибо за прояснение сомнений .. @Tomerikoo
Используйте эту функцию, если глубина вложенности списка является переменной.
C11=[[[353.856161, 0.0, 0.0], [0.0, 0.0, 282.754301, 0.0]], [[0.0, 294.983702, 126.991664]]]
def find_max(ls: list) -> list:
# does the list contain only numbers?
if all((isinstance(x, float) for x in ls)):
# if yes return simple max
return [max(ls)]
else:
# apply the function one level deeper
return [find_max(x) for x in ls]
print(find_max(C11))
просто хотел знать, можно ли это сделать итеративным способом ??
В случае, если глубина совершенно произвольна и вы хотите сохранить ту же структуру вложенности в выводе, вот рекурсивная функция, которая продолжает идти по уровням, пока не достигнет «листа» (список со значениями, а не списками) и принимает maximums:
def get_max(l):
res = []
if isinstance(l[0], list):
for sub in l:
res.append(get_max(sub))
else:
res.append(max(l))
return res
print(get_max([[[353.856161, 0.0, 0.0], [0.0, 0.0, 282.754301, 0.0]], [[0.0, 294.983702, 126.991664]]]))
Дам:
[[[353.856161], [282.754301]], [[294.983702]]]
Вот быстрый рекурсивный обобщенный подход. Должен работать с любым уровнем различной вложенности.
c11 = [[[353.856161, 0.0, 0.0], [0.0, 0.0, 282.754301, 0.0]], [[0.0, 294.983702, 126.991664]]]
result = []
def traverse(arr, result):
if len(arr) > 0:
if type(arr[0]) is list:
# check if item inside list is another list
for i in arr:
result = traverse(i, result)
else:
# if its a list of number, get the max and add it to result
result.append(max(arr))
return result
print(traverse(c11, result))
Использование рекурсии - лучший вариант. Рекурсивный работает для любой длины списка. Используется начальная проверка, чтобы проверить, пуст ли элемент списка.
Код:
check=[[[353.856161, 0.0, 0.0], [0.0, 0.0, 282.754301, 0.0]], [[0.0, 294.983702, 126.991664]]]
def recursive_max(lst):
if len(lst) == 0:
return []
if isinstance(lst[0], list):
min_val = []
for val in lst:
min_val.append(recursive_max(val))
return min_val
else:
return [max(lst)]
print(recursive_max(check))
Выход:
[[[353.856161], [282.754301]], [[294.983702]]]
Массив C11 представляет собой многомерный массив, который необходимо поместить во вложенный цикл
C11 = [[[353.856161, 0.0, 0.0], [0.0, 0.0, 282.754301, 0.0]], [[0.0, 294.983702, 126.991664]]]
for i in range(0, len(C11)):
for j in range(0, len(C11[i])):
C2 = max(C11[i][j])
print(C2)
Выход
Это предполагает только два уровня вложенности...
Я предположил, что глубина списка случайна.
Я использовал рекурсивный подход, чтобы заменить список последнего уровня списком с его максимальным значением.
def recurse(l):
for index in range(len(l)):
if type(l[index]) == list:
l[index] = recurse(l[index])
else:
l = [max(l)]
return l
return l
Пример:
l = [[5,3,8], [1,2,4], [[[2,4],[11,12]],[5,9]]]
recurse(l)
print(l)
Выход:
[[8], [4], [[[4], [12]], [9]]]
Ваш пример:
C11=[[[353.856161, 0.0, 0.0], [0.0, 0.0, 282.754301, 0.0]], [[0.0, 294.983702, 126.991664]]]
recurse(C11)
print(C11)
Выход:
[[[353.856161], [282.754301]], [[294.983702]]]
Примечание. Функция обновляет список на месте, поэтому, если вы хотите восстановить список, используйте копию старого списка.
Код:
C11=[[[353.856161, 0.0, 0.0], [0.0, 0.0, 282.754301, 0.0]], [[0.0, 294.983702, 126.991664]]]
C2=[]
for i in range(0,len(C11)):
C2.insert(i, [])
for j in range(0,len(C11[i])):
C2[i].insert(j, [])
C2[i][j].insert(0, max(C11[i][j]))
print(C2)
Выход:
[[[353.856161], [282.754301]], [[294.983702]]]
Ожидается ли, что глубина измерения списка будет случайной, как в примере? Если это так, вам понадобится более обобщенное решение, чем указано выше.