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

时间:2017-07-09 15:08:01

标签: 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']

在控制台测试之前,我认为结果应为['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

2 个答案:

答案 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)

从头开始,takeWhile符合条件,并在不符合条件时停止。您正在寻找filter(以及itertools.filterfalse):

list(filter(vowel, s))

或列表理解:

[c for c in s if vowel(c)]