Форум сайта python.su
Тут в какой-то соседней теме мне открыли глаза по поводу того что моя функция:
def flat(lst, flat_lst = []):
"""делает список одномерным"""
for lexem in lst:
if not is_atom_(lexem):
flat(lexem, flat_lst)
else:
flat_lst.append(lexem)
return flat_lst
def flat2(lst):
if (len(lst) == 1) and is_atom_(lst[0]):
return lst
else:
return flat2(lst[0:1]) + flat2(lst[1:])
Офлайн
Так?
def flat(lst):
flat_lst = []
for lexem in lst:
if not is_atom_(lexem):
flat_lst.extend(flat(lexem))
else:
flat_lst.append(lexem)
return flat_lst
Офлайн
Задача стоит перевести список любой вложенности и с наличием не-списковых элементов в одномерный?
Офлайн
Ну да +)
Так?похоже на то.
Отредактировано (Янв. 15, 2010 12:13:31)
Офлайн
Можно чуть покороче:
def flat(lst):
if is_atom_(lst):
return [lst]
return sum(map(flat, lst), [])
Офлайн
Спасибо!)
Но правда в этом случае подменяется маленько смысл, в качестве параметра функции передается не всегда список, но тут питон вылезает за счет динамической типизации.
Красиво вышло. Спасибо :)
Отредактировано (Янв. 15, 2010 12:25:07)
Офлайн
Не вижу разницы между вариантами. В самом первом lexem тоже используется так же двояко, как и в последнем.
Офлайн
в первом случае проверка на атомарность идет по элементам списка переданного в качестве параметра.
Во втором вашем варианте проверка на списковость происходит с самим параметром, а не с его элементами.
Хотя функция проверки на атомарность и правда использует lexem двояко, но там это подразумевалось…
Отредактировано (Янв. 15, 2010 12:44:03)
Офлайн
Да, точно. Я даже внимания не обратил. Привык уже, наверное.
Офлайн