Форум сайта python.su
Подскажите как пройтись по все элементам списк включая вложенные?
К примеру, нужно пройтись по такому списку:
lst = [1, 3, , 8]
Офлайн
смотря что надо получить в итоге, а делается это рекурсивной функцией
Офлайн
''' проходимся по всем элементам списка(и вложенных списков) и прибавляем к каждому элементу по единице. Функция type() используется для того, чтобы определить - текущий элемент является числом или же вложенным списком (для этого сравниваем то что type() возвращает, с константой ListType (тип объекта - список) из модуля types); функция len() - возвращает кол-во элементов списка; функция range() создает список с последовательным рядом чисел, напр range(5) создаст список [0, 1, 2, 3, 4]. ''' from types import * lst = [1, 3, [4,5,6], 8] for x in range(len(lst)): if type(lst[x]) is ListType: for y in range(len(lst[x])): lst[x][y] = lst[x][y] + 1 else: lst[x] = lst[x] + 1 print lst
Отредактировано (Апрель 9, 2008 12:54:04)
Офлайн
Хотя повторюсь, этот подход мне не нравится, вложенные циклы это очень и очень плохо.
Офлайн
Ну тогда уж, так:
from types import ListType def deep_map(fn, ls): """Обходим и возвращаем обработанную копию""" result = [] for x in ls: if type(x) is ListType: result.append(deep_map(fn, x)) else: result.append(fn(x)) return result def deep_iter(fn, ls): """Обходим и изменяем на месте """ for n, x in enumerate(ls): if type(x) is ListType: ls[n] = deep_iter(fn, x) else: ls[n] = fn(x) return ls ls = [1, 3, [4,5,6], 8] print deep_map(lambda x: x+1, ls) print ls deep_iter(lambda x: x+1, ls) print ls
Офлайн
lotos
Подскажите как пройтись по все элементам списк включая вложенные?
К примеру, нужно пройтись по такому списку:
lst = [1, 3, , 8]
lst = [1, 3, [4,5,6], 8] def iter( lst ): for l in lst: if isinstance( l, list ): iter( l ) else: print l#put your code here iter( lst )
Офлайн
DaevaornТолько название iter немного неудачное - одноименное с built-in функцией.lotos
Подскажите как пройтись по все элементам списк включая вложенные?
К примеру, нужно пройтись по такому списку:
lst = [1, 3, , 8]lst = [1, 3, [4,5,6], 8] def iter( lst ): for l in lst: if isinstance( l, list ): iter( l ) else: print l#put your code here iter( lst )
Офлайн
Только название iter немного неудачное - одноименное с built-in функцией.Ага, и переменная l, кст, тоже сбивает с толку ;), а так код весьма приятный.
Отредактировано (Апрель 9, 2008 13:13:07)
Офлайн
:)
import itertools
func = lambda L: itertools.chain(*(isinstance(x, (list, tuple)) and func(x) or (x,) for x in L))
for x in func([1, 3, , 8]): print x
Офлайн