为什么dropdrop和takewhile跳过最后一个?

sta*_*mer 2 python python-itertools

为什么dropwhiletakewhile跳过最后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']
Run Code Online (Sandbox Code Playgroud)

在控制台中测试之前,我认为结果应该是['r', 'd', 'v', 'r', 'k']['A', 'a', 'a']

该文件称,大约实施dropwhiletakewhile如下:

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
Run Code Online (Sandbox Code Playgroud)

Uri*_*iel 5

您不是在过滤字符串,而是要保留保留一定条件。

当到达"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']
Run Code Online (Sandbox Code Playgroud)