Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 9, 2008 07:46:40

lotos
От:
Зарегистрирован: 2008-04-07
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Пройтись по всем элементам списка

Подскажите как пройтись по все элементам списк включая вложенные?
К примеру, нужно пройтись по такому списку:
lst = [1, 3, , 8]



Офлайн

#2 Апрель 9, 2008 08:47:17

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Пройтись по всем элементам списка

смотря что надо получить в итоге, а делается это рекурсивной функцией



Офлайн

#3 Апрель 9, 2008 09:09:37

Teddy Bear
От:
Зарегистрирован: 2007-03-02
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

Пройтись по всем элементам списка

'''
проходимся по всем элементам списка(и вложенных списков) и прибавляем
к каждому элементу по единице.
Функция 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]



Отредактировано (Апрель 9, 2008 12:54:04)

Офлайн

#4 Апрель 9, 2008 09:34:58

Teddy Bear
От:
Зарегистрирован: 2007-03-02
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

Пройтись по всем элементам списка

Хотя повторюсь, этот подход мне не нравится, вложенные циклы это очень и очень плохо.



Офлайн

#5 Апрель 9, 2008 09:58:29

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Пройтись по всем элементам списка

Ну тогда уж, так:

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



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#6 Апрель 9, 2008 11:41:17

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Пройтись по всем элементам списка

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 )



Офлайн

#7 Апрель 9, 2008 13:09:20

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Пройтись по всем элементам списка

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 функцией.



Офлайн

#8 Апрель 9, 2008 13:12:41

Teddy Bear
От:
Зарегистрирован: 2007-03-02
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

Пройтись по всем элементам списка

Только название iter немного неудачное - одноименное с built-in функцией.
Ага, и переменная l, кст, тоже сбивает с толку ;), а так код весьма приятный.



Отредактировано (Апрель 9, 2008 13:13:07)

Офлайн

#9 Апрель 9, 2008 14:08:47

ofigetitelno
От:
Зарегистрирован: 2006-08-01
Сообщения: 136
Репутация: +  0  -
Профиль   Отправить e-mail  

Пройтись по всем элементам списка

:)
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



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version