Найти - Пользователи
Полная версия: многоуровенвый обход листов - как это сделать изящнее?
Начало » Python для новичков » многоуровенвый обход листов - как это сделать изящнее?
1
test157
все привет. вот появился такой вопрос. возможно ли делать такие обходы одним фором? идеально если это не ограничит вложенность двумя массивами, а можно будет делать 2 и 3
for i in [0, 1, 2, 3, 4, 5]:
for j in [0, 1, 2, 3, 4, 5]:
print i + j
slav0nic
от задачи зависит
например
for i, j in zip(range(10), range(10)): 
print i + j
crchemist
test157
возможно ли делать такие обходы одним фором?
ні
test157
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
Dimka665
посмотрите это
http://docs.python.org/library/itertools.html#itertools.product
test157
да вот это что нужно, правда более изящно можно только в питоне 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
если кто еще придумает вариант отпишите плиз - я почемуто думал, что можно както через лямбду это реализовать - правда я в них не очень, наверное отсюда такое мнение )
Dimka665
по ссылке приводится код, эквивалентный функции product из itertools Python 2.6, правда он сразу вычисляет все итераторы.
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]
test157
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 без скобок

а насчет предложенного вариант не сказал бы что это изящнее и быстрее, чем тот на котором остановился я выше )
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