itertools / takewhile -> дал мне неожиданный результат [0] - PullRequest
0 голосов
/ 03 марта 2020
from itertools import takewhile
list(takewhile(lambda x: x%2==0, range(10)))

Результат, который я хочу видеть - четные числа:

[0,2,4,6,8]

Результат, который я получаю:

[0]

Как это возможно, почему он дал мне ноль?

Ответы [ 3 ]

2 голосов
/ 03 марта 2020

Результат правильный. Ваше понимание takewhile кажется ошибочным. Takewhile будет продолжать принимать значения из итерируемого до тех пор, пока вы сначала не выполните условие. Когда это произойдет, это остановится. Так как 1 нарушает условие lambda x: x%2==0, то выполнение останавливается и возвращается [0].

Если вы хотите sh просто отфильтровать значения, вы можете использовать понимание списка или фильтр по мере необходимости.

list(filter(lambda x: x%2==0, range(10))) #OR
[i for i in range(10) if i%2==0]
#output:
[0, 2, 4, 6, 8]
2 голосов
/ 03 марта 2020

takewhile остановится на первом нечетном числе, вместо этого используйте filter:

list(filter(lambda x: x%2==0, range(10)))

Но для такой простой задачи вам даже не понадобится filter, что-то подобное будет работать а также:

list(range(0, 10, 2))
1 голос
/ 03 марта 2020

Вы, вероятно, хотите использовать filter вместо этого, например так:

list(filter(lambda x: x%2==0, range(10)))

takewhile возвращает элементы, пока указанное условие истинно. Когда оно перестает быть истинным, yield IN останавливается. Это не то, что вы, кажется, после.

...