Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 16, 2012 01:06:56

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

хочу в одном for параллельно перебрать 2 списка

Для примера кусок решающий эту задачу на 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 автоматом бежал сразу по двум спискам.



Офлайн

#2 Янв. 16, 2012 01:12:31

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

хочу в одном for параллельно перебрать 2 списка

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

Офлайн

#3 Янв. 16, 2012 01:39:01

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

хочу в одном for параллельно перебрать 2 списка

спасибо ) Питон мне уже начинает нравиться…) По аналогии с ответом на вопрос из заголовка попробовала решить задачу из примера. И вот что у меня вышло:

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

По сути это и есть то что мне было нужно.
Если есть замечания по такому варианту реализации, буду благодарна за их озвучивание.



Офлайн

#4 Янв. 16, 2012 03:55:28

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

хочу в одном for параллельно перебрать 2 списка

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 работает быстрее



Отредактировано (Янв. 16, 2012 04:06:58)

Офлайн

#5 Янв. 16, 2012 08:03:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

хочу в одном for параллельно перебрать 2 списка

FishHook
Старайтесь не использовать for для тривиальных случаев обхода списка. Для отладки пойдет, а в боевом коде лучше использовать map.
>>> map(lambda i: sys.stdout.write(i), zip(a,b,range(limit)))
map работает быстрее
это не работает



Офлайн

#6 Янв. 16, 2012 08:32:24

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

хочу в одном for параллельно перебрать 2 списка

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)

Офлайн

#7 Янв. 16, 2012 09:06:52

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

хочу в одном for параллельно перебрать 2 списка

А так еще лучше

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)

Офлайн

#8 Янв. 16, 2012 09:28:11

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

хочу в одном for параллельно перебрать 2 списка

Проверяем:

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
Результат на лицо



Офлайн

#9 Янв. 16, 2012 23:58:47

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

хочу в одном for параллельно перебрать 2 списка

а где 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
>>>



Офлайн

#10 Янв. 17, 2012 13:45:15

Обедающий философ
От:
Зарегистрирован: 2011-05-06
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

хочу в одном for параллельно перебрать 2 списка

Рыболовный крючок, на кой ты вообще с питоном связался, коли тебе так дороги миллисекунды?



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version