zoukankan      html  css  js  c++  java
  • python 跳过可迭代对象的开始部分

    想遍历一个可迭代对象,但是它开始的某些元素你并不感兴趣,想跳过它们

    itertools 模块中有一些函数可以完成这个任务。首先介绍的是itertools.dropwhile() 函数。使用时,你给它传递一个函数对象和一个可迭代对象。它会返回一个迭代器对象,丢弃原有序列中直到函数返回True 之前的所有元素,然后返回后面所有元素。为了演示,假定你在读取一个开始部分是几行注释的源文件。

    with open('/etc/passwd') as f:
    ... for line in f:
    ... print(line, end='')
    

     如果你想跳过开始部分的注释行的话,可以这样做:

    from itertools import dropwhile
    >>> with open('/etc/passwd') as f:
    ... for line in dropwhile(lambda line: line.startswith('#'), f):
    ... print(line, end='')
    

     这个例子是基于根据某个测试函数跳过开始的元素。如果你已经明确知道了要跳过的元素的个数的话,那么可以使用itertools.islice() 来代替。比如:

    from itertools import islice
    >>> items = ['a', 'b', 'c', 1, 4, 10, 15]
    >>> for x in islice(items, 3, None):
    ... print(x)
    ...
    14
    10
    15
    >>>
    

     在这个例子中, islice() 函数最后那个None 参数指定了你要获取从第3 个到最后的所有元素,如果None 和3 的位置对调,意思就是仅仅获取前三个元素恰恰相反,(这个跟切片的相反操作[3:] 和[:3] 原理是一样的)。

    函数dropwhile() 和islice() 其实就是两个帮助函数,为的就是避免写出下面这种冗余代码:

    with open('/etc/passwd') as f:
    # Skip over initial comments
    while True:
    line = next(f, '')
    if not line.startswith('#'):
    break
    # Process remaining lines
    while line:
    # Replace with useful processing
    print(line, end='')
    line = next(f, None)
    跳过一个可迭代对象的开始部分跟通常的过滤是不同的。比如,上述代码的第一个部分可能会这样重写:
    with open('/etc/passwd') as f:
    lines = (line for line in f if not line.startswith('#'))
    for line in lines:
    print(line, end='')
    

     这样写确实可以跳过开始部分的注释行,但是同样也会跳过文件中其他所有的注释行。换句话讲,我们的解决方案是仅仅跳过开始部分满足测试条件的行,在那以后,所有的元素不再进行测试和过滤了。最后需要着重强调的一点是,本节的方案适用于所有可迭代对象,包括那些事先不能确定大小的,比如生成器,文件及其类似的对象。

  • 相关阅读:
    python函数及模块
    Python分支结构及循环结构
    python基本的知识
    11.21学习总结
    进度日报28
    进度日报27
    进度日报26
    进度日报25
    进度日报24
    11.14学习总结
  • 原文地址:https://www.cnblogs.com/baxianhua/p/10027760.html
Copyright © 2011-2022 走看看