Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 15, 2010 09:44:36

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Перевод многомерного списка в одномерный.

Тут в какой-то соседней теме мне открыли глаза по поводу того что моя функция:

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 в обратном случае.



Офлайн

#2 Янв. 15, 2010 11:44:20

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Перевод многомерного списка в одномерный.

Так?

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



Офлайн

#3 Янв. 15, 2010 11:47:32

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Перевод многомерного списка в одномерный.

Задача стоит перевести список любой вложенности и с наличием не-списковых элементов в одномерный?

Офлайн

#4 Янв. 15, 2010 11:58:34

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Перевод многомерного списка в одномерный.

Ну да +)

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

Эээ, я наверно туплю но в чем отличие extend() от обычного сложения списков?



Отредактировано (Янв. 15, 2010 12:13:31)

Офлайн

#5 Янв. 15, 2010 12:10:00

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Перевод многомерного списка в одномерный.

Можно чуть покороче:

def flat(lst):
if is_atom_(lst):
return [lst]
return sum(map(flat, lst), [])



Офлайн

#6 Янв. 15, 2010 12:14:40

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Перевод многомерного списка в одномерный.

Спасибо!)
Но правда в этом случае подменяется маленько смысл, в качестве параметра функции передается не всегда список, но тут питон вылезает за счет динамической типизации.
Красиво вышло. Спасибо :)



Отредактировано (Янв. 15, 2010 12:25:07)

Офлайн

#7 Янв. 15, 2010 12:38:47

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Перевод многомерного списка в одномерный.

Не вижу разницы между вариантами. В самом первом lexem тоже используется так же двояко, как и в последнем.



Офлайн

#8 Янв. 15, 2010 12:41:55

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Перевод многомерного списка в одномерный.

в первом случае проверка на атомарность идет по элементам списка переданного в качестве параметра.
Во втором вашем варианте проверка на списковость происходит с самим параметром, а не с его элементами.

Хотя функция проверки на атомарность и правда использует lexem двояко, но там это подразумевалось…



Отредактировано (Янв. 15, 2010 12:44:03)

Офлайн

#9 Янв. 15, 2010 13:39:38

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Перевод многомерного списка в одномерный.

Да, точно. Я даже внимания не обратил. Привык уже, наверное.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version