Форум сайта python.su
0
Для примера кусок решающий эту задачу на 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 автоматом бежал сразу по двум спискам.
Офлайн
25
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
Офлайн
0
спасибо ) Питон мне уже начинает нравиться…) По аналогии с ответом на вопрос из заголовка попробовала решить задачу из примера. И вот что у меня вышло:
>>> 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
По сути это и есть то что мне было нужно.
Если есть замечания по такому варианту реализации, буду благодарна за их озвучивание.
Офлайн
568
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
По сути это и есть то что мне было нужно.
Если есть замечания по такому варианту реализации, буду благодарна за их озвучивание.
Отредактировано (Янв. 16, 2012 04:06:58)
Офлайн
857
FishHookэто не работает
Старайтесь не использовать for для тривиальных случаев обхода списка. Для отладки пойдет, а в боевом коде лучше использовать map.
>>> map(lambda i: sys.stdout.write(i), zip(a,b,range(limit)))
map работает быстрее
Офлайн
568
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)))
Отредактировано (Янв. 16, 2012 08:42:42)
Офлайн
568
А так еще лучше
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])]
Отредактировано (Янв. 16, 2012 09:34:45)
Офлайн
568
Проверяем:
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
Офлайн
857
а где 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
>>>
Офлайн
0
Рыболовный крючок, на кой ты вообще с питоном связался, коли тебе так дороги миллисекунды?
Офлайн