Наибольшее и наименьшее значение вложенных списков с использованием рекурсии - PullRequest
0 голосов
/ 30 сентября 2018

Я хочу взять список с вложенными списками.Затем выведите наибольшее значение индекса 0 или 2 в списке и самое низкое значение индекса 0 или 2, используя рекурсию.

Это то, что я получил до сих пор:

lst = [1, 5, [7, 10, []]]

def high_low(my_list):
    new_lst = []
    if not my_list:
        print max(new_lst)
        print min(new_lst)
    elif isinstance(my_list[0], int):
        return new_lst.append(my_list[0]) + high_low(my_list[2:])
    elif isinstance(my_list[0], list):
        return new_lst.append(max(my_list[0])) + high_low(my_list[2:])

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

>>> print_tree(lst)
10 
1

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

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

def high_low(l):
    try:
        l.extend(high_low(l.pop()))
    except AttributeError:
        return [l]
    except IndexError:
        return []
    return max(l), min(l)

, так что:

lst = [1, 5, [7, 10, []]]
print(high_low(lst))

выходы:

(10, 1)
0 голосов
/ 30 сентября 2018

Вот одна возможность написать код только с одним проходом, без необходимости во внешней библиотеке или Python min/max:

def high_low(list_or_number):
    if isinstance(list_or_number, list):
        current_min = float('inf')
        current_max = float('-inf')
        for x in list_or_number:
            x_max, x_min = high_low(x)
            if x_max > current_max:
                current_max = x_max
            if x_min < current_min:
                current_min = x_min
        return (current_max, current_min)
    else:
        return (list_or_number, list_or_number)

Например:

>>> high_low([1, 5, [7, 10, [[12, 16], -10]]])
(16, -10)
>>> high_low(3)
(3, 3)
>>> high_low([3,4,5])
(5, 3)
0 голосов
/ 30 сентября 2018

это может быть достигнуто с помощью аналогичного и классического решения проблем ( Сглаживание нерегулярного списка списков ), нет необходимости заново изобретать колесо, просто используйте какой-то метод работы и последующую обработку:

Свести список списков, затем взять минимальное и максимальное значения.

import collections

def flatten(l):   # function copied from the link above
    for el in l:
        if isinstance(el, collections.Iterable) and not isinstance(el, (str, bytes)):
            yield from flatten(el)
        else:
            yield el

lst = [1, 5, [7, 10, []]]

new_list = list(flatten(lst))  # create a list cos we'll be iterating twice on it
print(max(new_list))
print(min(new_list))

результат

10
1

с одной итерацией с ручным циклом:

min_value = None
max_value = None
for v in flatten(lst):
    if min_value is None or v < min_value:
        min_value = v
    if max_value is None or v > max_value:
        max_value = v

print(min_value)
print(max_value)

метод flatten хорош, потому что он не создает временных элементов list, поэтому нет необходимости выделять лишнюю память.

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