【问题标题】:DropWhile to extract between two specific linesDropWhile 在两个特定行之间提取
【发布时间】:2016-07-20 10:44:14
【问题描述】:

在 Python 中使用 DropWhile 进行练习,并且遇到了一些困难。

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

Test1
Test2
Test3
Test4
Test5
Test6
Test7
Test8
Test9
Test10

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

我知道如何以另一种方式执行此操作(对于文件中的行...获取最后一行...如果行> 5 ....如果行

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

例如

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 行中使用长 lambda 表达式而不是使用单独的函数的另一种方法,但是当我做了这样的事情时:

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

如果我只有一个表达式(即 int(line.strip()[-1]) > 5 或 int(line.strip()[-1])

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

【问题讨论】:

    标签: python itertools


    【解决方案1】:

    DropWhile 不是你需要的,从功能上来说你必须使用过滤器:

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

    一旦条件达到一次,DropWhile 将停止,因此一旦达到Test6,列表将继续具有其余值

    【讨论】:

    • 或者,迭代生成器表达式:for line in (line for line in dataset if 5 &lt; int(line.strip()[-1]) &lt; 8):
    【解决方案2】:

    如果您打算在数据集上使用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()
    

    这会给你:

    Test6
    Test7
    

    所以它分两步工作,首先将每一行删除到所需的起点,然后只取行直到所需的终点,此时它完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      相关资源
      最近更新 更多