Как найти максимум подсписков в произвольном вложенном списке?

У меня есть список 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]]]

Ожидается ли, что глубина измерения списка будет случайной, как в примере? Если это так, вам понадобится более обобщенное решение, чем указано выше.

Saharsh 02.01.2023 10:36

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

AEinstein 02.01.2023 10:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
87
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Понимание списка

Код:-

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 02.01.2023 11:27

можете ли вы предложить, что я должен отредактировать в этом понимании списка ... или с помощью понимания списка это невозможно сделать? @Tomerikoo

Yash Mehta 02.01.2023 11:48

Я не могу придумать способ использования циклов, так как вам придется буквально писать циклы, но вы не можете знать заранее, сколько вам понадобится... Может быть, как-то с циклом while, но тогда это не может быть понимание списка

Tomerikoo 02.01.2023 14:58

спасибо за прояснение сомнений .. @Tomerikoo

Yash Mehta 02.01.2023 15:18

Используйте эту функцию, если глубина вложенности списка является переменной.

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))

просто хотел знать, можно ли это сделать итеративным способом ??

Yash Mehta 02.01.2023 11:58
Ответ принят как подходящий

В случае, если глубина совершенно произвольна и вы хотите сохранить ту же структуру вложенности в выводе, вот рекурсивная функция, которая продолжает идти по уровням, пока не достигнет «листа» (список со значениями, а не списками) и принимает 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)

Выход

Это предполагает только два уровня вложенности...

Tomerikoo 02.01.2023 11:31

Я предположил, что глубина списка случайна.

Я использовал рекурсивный подход, чтобы заменить список последнего уровня списком с его максимальным значением.

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

Другие вопросы по теме