为什么dropwhile
和takewhile
跳过以下例子中的最后一个a
?
>>> import itertools
>>> s = "Aardvark"
>>> def vowel(c):
... return c.lower() in "aeiou"
...
>>> list(itertools.dropwhile(vowel, s))
['r', 'd', 'v', 'a', 'r', 'k']
>>> list(itertools.takewhile(vowel, s))
['A', 'a']
在控制台测试之前,我认为结果应为['r', 'd', 'v', 'r', 'k']
和['A', 'a', 'a']
。
文档说明dropwhile
和takewhile
的粗略实现如下:
def dropwhile(predicate, iterable):
# dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1
iterable = iter(iterable)
for x in iterable:
if not predicate(x):
yield x
break
for x in iterable:
yield x
def takewhile(predicate, iterable):
# takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4
for x in iterable:
if predicate(x):
yield x
else:
break
答案 0 :(得分:4)
您不是过滤字符串,丢弃或接受,因为维持了特定条件。
当到达不是元音的"r"
时,掉线会停止下降,剩下的就是,当到达不是元音的"r"
时,接听时间会停止,并且放下其余部分。
您可以使用filter
获得所需的行为:
>>> list(filter(lambda x: x.lower() in 'aeoui', "Aardvark"))
['A', 'a', 'a']
>>> list(filter(lambda x: x.lower() not in 'aeoui', "Aardvark"))
['r', 'd', 'v', 'r', 'k']
答案 1 :(得分:1)
从头开始,take
项While
符合条件,并在不符合条件时停止。您正在寻找filter
(以及itertools.filterfalse
):
list(filter(vowel, s))
或列表理解:
[c for c in s if vowel(c)]