Найти - Пользователи
Полная версия: хочу в одном for параллельно перебрать 2 списка
Начало » Python для новичков » хочу в одном for параллельно перебрать 2 списка
1 2 3
news-tester
Для примера кусок решающий эту задачу на java

public boolean equals(Object c){

Iterator<Line> itMy = this.iterator();
Iterator<Line> itC = ((Cluster)c).iterator();

for(int i = 0; i < limit; i++){

Line myLine = itMy.next();
Line cLine = itC.next();

if(!myLine.value.equals(cLine.value))
return false;

}

return true;
}
}

это хоть и не питон, но идея обхода списков думаю понятна. Можно, конечно сделать как в примере - задать счетчик и по нему обращаться к i-ому элементу. Но ведь есть же чудо-конструкция for a in a_list:, вот и спрашиваю нет ли чего-то типа for a, b in a_list, b_list:, чтоб for автоматом бежал сразу по двум спискам.
s0rg
In [1]: a, b = [1, 2, 3, 4, 5], ['a', 'b', 'c', 'd', 'e']

In [2]: a
Out[2]: [1, 2, 3, 4, 5]

In [3]: b
Out[3]: ['a', 'b', 'c', 'd', 'e']

In [4]: for c, d in zip(a, b):
...: print c, d
1 a
2 b
3 c
4 d
5 e
news-tester
спасибо ) Питон мне уже начинает нравиться…) По аналогии с ответом на вопрос из заголовка попробовала решить задачу из примера. И вот что у меня вышло:

>>> a, b, limit = , , 3
>>> a

>>> b

>>> range(limit)

>>> for a_el, b_el, l in zip(a, b, range(limit)):
print a_el, b_el, l


1 a 0
2 b 1
3 c 2

По сути это и есть то что мне было нужно.
Если есть замечания по такому варианту реализации, буду благодарна за их озвучивание.
FishHook
news-tester
спасибо ) Питон мне уже начинает нравиться…) По аналогии с ответом на вопрос из заголовка попробовала решить задачу из примера. И вот что у меня вышло:

>>> a, b, limit = , , 3
>>> a

>>> b

>>> range(limit)

>>> for a_el, b_el, l in zip(a, b, range(limit)):
print a_el, b_el, l


1 a 0
2 b 1
3 c 2

По сути это и есть то что мне было нужно.
Если есть замечания по такому варианту реализации, буду благодарна за их озвучивание.
Не замечания, а просто информация к сведению
1.
>>> a, b, limit = , , 3
строка и так является списком, не надо делать список искусственно
>>> a, b, limit = , ‘abcde’, 3
ИМХО так написать проще
2.
>>> for a_el, b_el, l in zip(a, b, range(limit)):
print a_el, b_el, l
Старайтесь не использовать for для тривиальных случаев обхода списка. Для отладки пойдет, а в боевом коде лучше использовать map.
>>> map(lambda i: sys.stdout.write(i), zip(a,b,range(limit)))
map работает быстрее
py.user.next
FishHook
Старайтесь не использовать for для тривиальных случаев обхода списка. Для отладки пойдет, а в боевом коде лучше использовать map.
>>> map(lambda i: sys.stdout.write(i), zip(a,b,range(limit)))
map работает быстрее
это не работает
FishHook
py.user.next
FishHook
Старайтесь не использовать for для тривиальных случаев обхода списка. Для отладки пойдет, а в боевом коде лучше использовать map.
>>> map(lambda i: sys.stdout.write(i), zip(a,b,range(limit)))
map работает быстрее
это не работает
Действительно, тогда так
from __future__ import print_function
map(lambda (x,y,z): print(x,y), zip(a,b,range(limit)))
FishHook
А так еще лучше
a, b, limit = [1, 2, 3, 4, 5], 'abcde', 3
map(print, a[:limit], b[:limit])
a, b, limit = [1, 2, 3, 4, 5], 'abcde', 3
[print(x,y) for x,y in zip(a[:limit],b[:limit])]
FishHook
Проверяем:
from __future__ import print_function
from timeit import Timer
time=Timer()


a, b, limit = [1, 2, 3, 4, 5], ['a', 'b', 'c', 'd', 'e'], 3

def test_func(*args):
range(1000000)
pass


t1=time.timer()

for x, y, z in zip(a, b, range(limit)):
test_func(x, y, z)

t2=time.timer()-t1
print('for', t2)

t1=time.timer()
map(test_func, zip(a,b,range(limit)))
t2=time.timer()-t1
print ('map+zip', t2)



t1=time.timer()
map(test_func, a[:limit], b[:limit], xrange(limit))
t2=time.timer()-t1
print ('map without zip', t2)
for 0.147354841232
map+zip 0.107038974762
map without zip 0.101311922073
Результат на лицо
py.user.next
а где print в последнем ?

>>> from __future__ import print_function
>>> [print(x,y) for x,y in zip(a[:limit],b[:limit])]
1 a
2 b
3 c
[None, None, None]
>>>
>>> a, b, limit = [1, 2, 3, 4, 5], 'abcde', 3
>>> map(print, a[:limit], b[:limit])
1 a
2 b
3 c
[None, None, None]
>>>
исходный вариант
>>> a, b, limit = [1, 2, 3, 4, 5], ['a', 'b', 'c', 'd', 'e'], 3
>>> for a_el, b_el, l in zip(a, b, range(limit)):
... print a_el, b_el, l
...
1 a 0
2 b 1
3 c 2
>>>
Обедающий философ
Рыболовный крючок, на кой ты вообще с питоном связался, коли тебе так дороги миллисекунды?
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