Я пытаюсь сделать функцию, которая возвращает максимум из вложенного списка?

python recursion

762 просмотра

6 ответа

6 Репутация автора

Я написал это, и он работает нормально со всем, но когда у меня есть пустой список в данном списке ( given_list=[[],1,2,3]), он говорит, что индекс находится вне диапазона. Любая помощь?

def r_max (given_list):
    largest = given_list[0]
    while type(largest) == type([]):
        largest = largest[0]

    for element in given_list:
        if type(element) == type([]):
            max_of_elem = r_max(element)
            if largest < max_of_elem:
                largest = max_of_elem
        else:                           # element is not a list
            if largest < element:
                largest = element

    return largest
Автор: Faisal Источник Размещён: 04.02.2015 02:25

Ответы (6)


1 плюс

100 Репутация автора

Вы предполагаете, что в Given_list есть как минимум 1 элемент, который является неправильным. Чтобы избежать индекса вне диапазона, вы можете добавить

if (len(given_list) == 0)
  return None

к началу вашей функции.

Автор: Benson Zhang Размещён: 04.02.2015 03:23

1 плюс

7024 Репутация автора

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

def r_max (given_list):
    largest = given_list[0]
    while type(largest) == type([]):
        largest = largest[0]

    for element in given_list:
        if type(element) == type([]):
            # If the list is empty, skip
            if(len(elemnt) == 0)
                next
            max_of_elem = r_max(element)
            if largest < max_of_elem:
                largest = max_of_elem
        else:                           # element is not a list
            if largest < element:
                largest = element

    return larges

в то время как вы на это, вы можете assert len(given_list)>0или что-то подобное.

Автор: Jthorpe Размещён: 04.02.2015 03:23

0 плюса

671083 Репутация автора

Если вложение произвольно глубокое, сначала нужно рекурсия, чтобы распутать его:

def items(x):
    if isinstance(x, list):
        for it in x:
            for y in items(it): yield y
    else: yield x

Теперь max(items(whatever))будет работать нормально.

В последних выпусках Python 3 вы можете сделать это более элегантным, изменив

        for it in x:
            for y in items(x): yield y

в:

        for it in x: yield from it
Автор: Alex Martelli Размещён: 04.02.2015 03:30

0 плюса

934 Репутация автора

Если вы уверены, что там будет только один уровень вложенности, вы можете сделать что-то вроде

def r_max(lst):
    new_lst = []
    for i in lst:
        try:
            new_lst.extend(i)
        except TypeError:
            new_lst + [i]
    return max(new_lst)

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

Об этом решении я хотел бы выделить две вещи, в отличие от ваших:

  1. Вся проверка типов, которую вы делаете ( type(largest) == type([])и т. Д.), Не считается идиоматическим Python. Это работает, но одним из ключевых моментов Python является то, что он поддерживает типизацию утиной утилитой / EAFP , что означает, что вам следует больше интересоваться тем, что может делать объект (в отличие от того, какой он тип), и что вам следует просто попробовать вещи и выздороветь, в отличие от выяснения, если вы можете сделать это.
  2. Python имеет очень хорошую функцию «найти наибольшее число в списке» - max. Если вы можете сделать свой вклад не вложенным списком, то maxвсе остальное сделает за вас.
Автор: Dan Размещён: 04.02.2015 03:34

0 плюса

309 Репутация автора

Это найдет максимум в списке, который содержит вложенные списки и проигнорирует строковые экземпляры.

A = [2, 4, 6, 8, [[11, 585, "tu"], 100, [9, 7]], 5, 3, "ccc", 1]

def M(L):

    # If list is empty, return nothing
    if len(L) == 0:
        return

    # If the list size is one, it could be one element or a list
    if len(L) == 1:

        # If it's a list, get the maximum out of it
        if isinstance(L[0], list):
            return M(L[0])
        # If it's a string, ignore it
        if isinstance(L[0], str):
            return
        # Else return the value
        else:
            return L[0]

    # If the list has more elements, find the maximum
    else:
        return max(M(L[:1]), M(L[1:]))


print A
print M(A)

БЛОГ Падмаля

Автор: Blogger Размещён: 24.10.2016 12:46

0 плюса

1 Репутация автора

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

Это предположение будет касаться случаев, таких как [], [1,2, [], 5,4, []]

def find_max(L):

    if len(L) == 0:
        return float("-inf")
    elif len(L) == 1:
        if isinstance(L[0], list):
            return find_max(L[0])
        else:
            return L[0]
    elif len(L) == 2:
        if isinstance(L[0], list):
            firstMax = find_max(L[0])
        else:
            firstMax = L[0]
        if isinstance(L[1], list):
            lastMax = find_max(L[1])
        else:
            lastMax = L[1]
        if firstMax > lastMax:
            return firstMax
        else:
            return lastMax
    else:
        if isinstance(L[0], list):
            firstMax = find_max(L[0])
            lastMax = find_max(L[1:])
            if firstMax > lastMax:
                return firstMax
            else:
                return lastMax
        else:
            lastMax = find_max(L[1:])
            if L[0] > lastMax:
                return L[0]
            else:
                return lastMax
Автор: Zelin Размещён: 30.10.2016 04:41
Вопросы из категории :
32x32