Найти - Пользователи
Полная версия: Список произвольной вложенности.
Начало » Python для новичков » Список произвольной вложенности.
1 2
4kpt_III
Я все прекрасно понял. Это Вы не поняли меня…

Kon52
Просто мне кажется, что чел, писавший эту функцию, понимал что он делает и для чего..

То, что “чел” понимает, что он делает и для чего еще не значит, что это правильно, хорошо и нужно за ним повторять

Насчет mutable как атрибутов по-умолчанию практика такая же как и с global. Это плохо и за это можно получить по шапке.
Kon52
4kpt_III
Это плохо и за это можно получить по шапке.
Ага, только никто так и не раскрыл великую тайну- почему?
Ладно, докапываться не буду, конечно, приму к сведению.
Спасибо за совет, что ли
4kpt_III
Kon52
Ага, только никто так и не раскрыл великую тайну- почему?

Нет никаких тайн. Это очевидно. Код получается сложночитаемым, неоднозначным и можно выхватить неожиданные и трудноотлавливаемые ошибки.
Kon52
4kpt_III
Код получается сложночитаемым, неоднозначным и можно выхватить неожиданные и трудноотлавливаемые ошибки.
Там ещё такой вариант был:
merge = lambda lst: reduce(lambda a, b: a.extend(merge(b)) or a if isinstance(b, list) else a.append(b) or a, lst, [])
Вот он показался реально сложночитаемым и неоднозначным.
Какой на Ваш взгляд оптимальный вариант для решения задачи по разворачиванию такого списка?
4kpt_III
Kon52
Какой на Ваш взгляд оптимальный вариант для решения задачи по разворачиванию такого списка?

Передавать явно в функцию пустой список для сохранения результата разворачивания.
4kpt_III
Или передавайте или используйте полноценно mutable. Короче, держите

Вариант раз.

def open_list(list_from):
    accumulator = []
    for elem in list_from:
        if not isinstance(elem, list):
            accumulator.append(elem)
        else:
            accumulator.extend(open_list(elem))
    return accumulator
#
a = [1, 2, [3, 4], [5, [6, 7]]]
print(open_list(a))

Вариант два.

def open_list(list_from):
    accumulator = []
    for elem in list_from:
        if not isinstance(elem, list):
            accumulator += [elem]
        else:
            accumulator += open_list(elem)
    return accumulator
#
a = [1, 2, [3, 4], [5, [6, 7]]]
print(open_list(a))
ayb
Херово это потому, что функция не должна иметь состояния. Ее результат в любой части программы должен зависеть только от переданных аргументов.
doza_and
Вообще правильное решение применить “встроенную” функцию flatten. Однако в сообществе длительное время идет война сторонников и противников рекурсивного flatten (одноуровневый flatten это concat).
http://programmers.stackexchange.com/questions/254279/why-doesnt-python-have-a-flatten-function-for-lists
И на этом форуме flatten обсуждается регулярно. Я думаю что отказ от flatten в стандартной библиотеке большая глупость. В питоне не очень часто использую (хотя для себя конечно ее написал). Но в Wolfram mathematica не было ни одной программы без flatten. Если она появится в любом виде то точно будет востребована.
Вариант
http://code.activestate.com/recipes/577255-flatten-a-list-or-list-of-lists-etc/
мне кажется лучше чем
isinstance(elem, list)
поскольку позволяют работать с любыми спископодобными объектами а не только со списками.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB