DropWhile在两个特定行之间提取

时间:2016-07-20 10:44:15

标签: python itertools

在Python中使用DropWhile进行练习,并且遇到了麻烦。

例如,如果这是文件中的行:

Test1
Test2
Test3
Test4
Test5
Test6
Test7
Test8
Test9
Test10

我想拉出Test5和Test8之间的界限。

我知道如何以另一种方式做到这一点(对于文件中的行...获取行的最后一行...如果行> 5 ....如果行< 8 ... print);但我特别想练习使用DropWhile。

我尝试了几种不同的方式,但我似乎无法让它起作用:

e.g。

dataset = open(sys.argv[1]).readlines()
def print_out(line):
    if int(line.strip()[-1]) > 5:
        if int(line.strip()[-1]) < 8:
            return True
        else:
            return False

for line in dropwhile(lambda line: print_out(line) == True, dataset):
    print line.strip()

这不起作用,所有行都打印出来。

另一种方法我尝试在dropwhile行中使用long lambda表达式而不是使用单独的函数,但是当我做了类似这样的事情时:

for line in dropwhile(lambda line: 5 < int(line.strip()[-1]) < 8, dataset):

如果我只有一个表达式(即int(line.strip()[ - 1])&gt; 5或int(line.strip()[ - 1])&lt; 8,但不是两者都有,则此代码有效

我想知道是否有人可以使用DropWhile向我展示pythonic方式,在我的测试数据集中拉出Test5和Test8之间的界限?

2 个答案:

答案 0 :(得分:2)

DropWhile不是您所需要的,从功能方面您必须使用过滤器:

filter(lambda line: 5 < int(line.strip()[-1]) < 8, dataset)

DropWhile会在条件达到一次后停止,因此一旦达到Test6

,列表将继续包含其余值

答案 1 :(得分:0)

如果您打算在数据集上使用ftp.exe,那么您还需要使用dropwhile()来获取所需的行,如下所示:

takewhile()

这会给你:

from itertools import takewhile, dropwhile


for line in takewhile(lambda x:  int(x.strip()[-1]) < 8, dropwhile(lambda x:  int(x.strip()[-1]) <= 5, dataset)):
    print line.strip()

所以它分两步完成,首先将每一行丢弃到所需的起点,然后只取线直到所需的终点,此时它就完成了。