Найти - Пользователи
Полная версия: Пройтись по всем элементам списка
Начало » Python для экспертов » Пройтись по всем элементам списка
1
lotos
Подскажите как пройтись по все элементам списк включая вложенные?
К примеру, нужно пройтись по такому списку:
lst = [1, 3, , 8]
poltergeist
смотря что надо получить в итоге, а делается это рекурсивной функцией
Teddy Bear
'''
проходимся по всем элементам списка(и вложенных списков) и прибавляем
к каждому элементу по единице.
Функция 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

>>> [2, 4, , 9]
Teddy Bear
Хотя повторюсь, этот подход мне не нравится, вложенные циклы это очень и очень плохо.
PooH
Ну тогда уж, так:
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 )
ZAN
Daevaorn
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 функцией.
Teddy Bear
Только название iter немного неудачное - одноименное с built-in функцией.
Ага, и переменная l, кст, тоже сбивает с толку ;), а так код весьма приятный.
ofigetitelno
:)
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
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