2016-02-03 2 views
1

У меня возникла проблема с тем, что я не понимаю, как работает код itertools.takewhile().itertools.takewhile() доступ к следующему элементу в python

import itertools 

z = [3,3,9,4,1] 

zcycle = itertools.cycle(z) 
next_symbol = zcycle.next() 
y = list(itertools.takewhile(lambda symbol: symbol == next_symbol or symbol == 9, zcycle)) 
print y 

мой код предположит, чтобы дать мне элементы списка с самого начала, если они одинаковы, или если элемент равен 9. Поэтому, как только мы попали элемент, который отличается от предыдущего, мы должны остановиться.

Я ожидал, что результатом будет [3, 3], но вместо этого я получил [3, 9]. Почему мы пропустили самый первый элемент списка? и возможно ли как-то получить выход равным [3, 3, 9]?

+0

Если вход 'г = [3, 3, 9, 9, 3, 4, 1]' , что вы ожидаете от вывода? '[3, 3, 9]'? '[3, 3, 9, 9]'? '[3, 3, 9, 9, 3]'? – DainDwarf

+0

[3, 3, 9, 9, 3] –

+0

Почему вы ожидали [3, 3] вместо [3, 3, 9]? –

ответ

2

Вы удалили первый 3 из последовательности здесь:

next_symbol = zcycle.next() 

Это продвигает zcycle к следующему элементу, поэтому он будет давать еще один 3, а не два.

Не звоните next() на объект zcycle; возможно использовать z[0] вместо:

next_symbol = z[0] 

Теперь zcycle даст 3, то другой 3, затем 9, после чего состояние takewhile() будет False и все итерации остановится.

+0

Спасибо) и еще один вопрос - как я понимаю, если список состоит из равных элементов, то будет бесконечный цикл. Как мне избежать этого и вернуть тот же список в этом случае? пример [3,3,3,3,3] или [3,3,9,3,3] возвращается [3,3,3,3,3]/[3,3,9,3,3] –

+0

@ Taras_G: вы можете использовать 'itertools.islice()', чтобы ограничить результат той же длиной, что и вход. –

+0

@Taras_G В этом случае, как насчет того, чтобы не использовать 'цикл'? –

0

можно сделать это с тройником в GroupBy, если вы имели actul итератора:

from itertools import tee, groupby, cycle 

z = [3, 3, 9, 4, 1] 
zcycle = cycle(z) 
a, b = tee(zcycle) 
next_symbol = next(b) 
grps = groupby(a, key=lambda symbol: symbol in {9, next(b), next_symbol}) 
g = next(grps) 
if g[0]: 
    print(list(g[1])) 
Смежные вопросы