Уведомления

Группа в Telegram: @pythonsu

#1 Май 31, 2009 22:16:24

test157
От:
Зарегистрирован: 2009-02-25
Сообщения: 54
Репутация: +  0  -
Профиль   Отправить e-mail  

многоуровенвый обход листов - как это сделать изящнее?

все привет. вот появился такой вопрос. возможно ли делать такие обходы одним фором? идеально если это не ограничит вложенность двумя массивами, а можно будет делать 2 и 3

for i in [0, 1, 2, 3, 4, 5]:
for j in [0, 1, 2, 3, 4, 5]:
print i + j



Офлайн

#2 Май 31, 2009 23:32:06

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

многоуровенвый обход листов - как это сделать изящнее?

от задачи зависит
например

for i, j in zip(range(10), range(10)): 
print i + j

Офлайн

#3 Июнь 1, 2009 01:50:39

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

многоуровенвый обход листов - как это сделать изящнее?

test157
возможно ли делать такие обходы одним фором?
ні



Офлайн

#4 Июнь 1, 2009 08:07:35

test157
От:
Зарегистрирован: 2009-02-25
Сообщения: 54
Репутация: +  0  -
Профиль   Отправить e-mail  

многоуровенвый обход листов - как это сделать изящнее?

slav0nic
я уже пробовал с зипом - но это не то, в моем примере видно же - что каждый раз с для каждого элемента i будет проходится весь массив j - вот нужен именно такой эффект, когда нужно сделать обход всех комбинаций. zip дает иной эффект.
for i, j in zip(range(0,5), range(5,10)):
print i, j


0 5
1 6
2 7
3 8
4 9
а нужно
for i in range(0,5):
for j in range(0,5):
print i,j


0 0
0 1
0 2
0 3
0 4
1 0
1 1
1 2
1 3
1 4
2 0
2 1
2 2
2 3
2 4
3 0
3 1
3 2
3 3
3 4
4 0
4 1
4 2
4 3
4 4



Офлайн

#5 Июнь 1, 2009 08:51:11

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

многоуровенвый обход листов - как это сделать изящнее?

Офлайн

#6 Июнь 1, 2009 10:26:59

test157
От:
Зарегистрирован: 2009-02-25
Сообщения: 54
Репутация: +  0  -
Профиль   Отправить e-mail  

многоуровенвый обход листов - как это сделать изящнее?

да вот это что нужно, правда более изящно можно только в питоне 2.6 (( в 2.5 получается вот такой вариант, что имхо не сильно нагляднее предыдущего - но зато в одну строчку

for x, y in [(x,y) for x in [1,2,3] for y in [4,5,6]]:
print x,y
если кто еще придумает вариант отпишите плиз - я почемуто думал, что можно както через лямбду это реализовать - правда я в них не очень, наверное отсюда такое мнение )



Отредактировано (Июнь 1, 2009 10:27:22)

Офлайн

#7 Июнь 1, 2009 10:40:06

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

многоуровенвый обход листов - как это сделать изящнее?

по ссылке приводится код, эквивалентный функции product из itertools Python 2.6, правда он сразу вычисляет все итераторы.



Офлайн

#8 Авг. 17, 2009 16:21:14

unel
От:
Зарегистрирован: 2009-05-24
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

многоуровенвый обход листов - как это сделать изящнее?

если необходимо просто пройтись по всем элементам списка, то его можно рекурсивно “развернуть” =)

def expand_list(l):
result = []
for item in l:
if type(item) == type(list()): #а как, кстати, правильно узнавать тип переменной? =)
result = result + expand_list(item)
else:
result = result + [item]
return result
>>> l = [1,2,3,[4,5,[6,7,8,[9,10]]]]
>>> expand_list(l)
[1,2,3,4,5,6,7,8,9,10]



Офлайн

#9 Авг. 18, 2009 06:20:39

test157
От:
Зарегистрирован: 2009-02-25
Сообщения: 54
Репутация: +  0  -
Профиль   Отправить e-mail  

многоуровенвый обход листов - как это сделать изящнее?

unel
если необходимо просто пройтись по всем элементам списка, то его можно рекурсивно “развернуть” =)
def expand_list(l):
result = []
for item in l:
if type(item) == type(list()): #а как, кстати, правильно узнавать тип переменной? =)
result = result + expand_list(item)
else:
result = result + [item]
return result
>>> l = [1,2,3,[4,5,[6,7,8,[9,10]]]]
>>> expand_list(l)
[1,2,3,4,5,6,7,8,9,10]
тип можно указывать просто - написав list без скобок

а насчет предложенного вариант не сказал бы что это изящнее и быстрее, чем тот на котором остановился я выше )



Отредактировано (Авг. 18, 2009 06:22:15)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version