Найти - Пользователи
Полная версия: Перевод многомерного списка в одномерный.
Начало » Python для новичков » Перевод многомерного списка в одномерный.
1
Zubchick
Тут в какой-то соседней теме мне открыли глаза по поводу того что моя функция:
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
является чудищем и что так писать нельзя в принципе! Я полностью согласился и честно попытался переписать ее. Но что-то меня заклинило. ХЕЛП!

попытка 2 уходит в глубокую рекурсию…
def flat2(lst):
if (len(lst) == 1) and is_atom_(lst[0]):
return lst
else:
return flat2(lst[0:1]) + flat2(lst[1:])
функция is_atom_ возвращает True если элемент не является списком и False в обратном случае.
Ed
Так?
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
Ferroman
Задача стоит перевести список любой вложенности и с наличием не-списковых элементов в одномерный?
Zubchick
Ну да +)

Так?
похоже на то.

Эээ, я наверно туплю но в чем отличие extend() от обычного сложения списков?
Ed
Можно чуть покороче:
def flat(lst):
if is_atom_(lst):
return [lst]
return sum(map(flat, lst), [])
Zubchick
Спасибо!)
Но правда в этом случае подменяется маленько смысл, в качестве параметра функции передается не всегда список, но тут питон вылезает за счет динамической типизации.
Красиво вышло. Спасибо :)
Ed
Не вижу разницы между вариантами. В самом первом lexem тоже используется так же двояко, как и в последнем.
Zubchick
в первом случае проверка на атомарность идет по элементам списка переданного в качестве параметра.
Во втором вашем варианте проверка на списковость происходит с самим параметром, а не с его элементами.

Хотя функция проверки на атомарность и правда использует lexem двояко, но там это подразумевалось…
Ed
Да, точно. Я даже внимания не обратил. Привык уже, наверное.
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