Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 25, 2015 00:19:05

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Список произвольной вложенности.

Я все прекрасно понял. Это Вы не поняли меня…

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

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

Насчет mutable как атрибутов по-умолчанию практика такая же как и с global. Это плохо и за это можно получить по шапке.

Офлайн

#2 Окт. 25, 2015 00:37:26

Kon52
Зарегистрирован: 2015-01-31
Сообщения: 66
Репутация: +  3  -
Профиль   Отправить e-mail  

Список произвольной вложенности.

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

Офлайн

#3 Окт. 25, 2015 00:48:55

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Список произвольной вложенности.

Kon52
Ага, только никто так и не раскрыл великую тайну- почему?

Нет никаких тайн. Это очевидно. Код получается сложночитаемым, неоднозначным и можно выхватить неожиданные и трудноотлавливаемые ошибки.

Офлайн

#4 Окт. 25, 2015 01:02:44

Kon52
Зарегистрирован: 2015-01-31
Сообщения: 66
Репутация: +  3  -
Профиль   Отправить e-mail  

Список произвольной вложенности.

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, [])
Вот он показался реально сложночитаемым и неоднозначным.
Какой на Ваш взгляд оптимальный вариант для решения задачи по разворачиванию такого списка?

Офлайн

#5 Окт. 25, 2015 01:07:14

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Список произвольной вложенности.

Kon52
Какой на Ваш взгляд оптимальный вариант для решения задачи по разворачиванию такого списка?

Передавать явно в функцию пустой список для сохранения результата разворачивания.

Офлайн

#6 Окт. 25, 2015 01:22:59

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Список произвольной вложенности.

Или передавайте или используйте полноценно 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))

Отредактировано 4kpt_III (Окт. 25, 2015 01:31:50)

Офлайн

#7 Окт. 25, 2015 08:08:50

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Список произвольной вложенности.

Херово это потому, что функция не должна иметь состояния. Ее результат в любой части программы должен зависеть только от переданных аргументов.

Отредактировано ayb (Окт. 25, 2015 08:09:29)

Офлайн

#8 Окт. 25, 2015 08:31:17

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Список произвольной вложенности.

Вообще правильное решение применить “встроенную” функцию 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)
поскольку позволяют работать с любыми спископодобными объектами а не только со списками.



Отредактировано doza_and (Окт. 25, 2015 08:33:07)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version