zoukankan      html  css  js  c++  java
  • 迭代的模块itertools

    itertools模块提供的全部是处理迭代功能的函数,他们的返回值不是list,而是迭代对象,只有在for循环的时候才会真正去计算。


    使用迭代器的好处是在循环的时候才去取值,而直接返回值为list的结果会占用大量的内存,从而使用迭代器的话,使用了惰计算的方式,或者是延迟计算,从而在性能上能好很多。


    在使用import的时候,具有两种方式,如下:

    import itertools
    from itertools import *
    第一种是直接进行导入,在使用模块里的函数的时候,必须带有前缀itertools,然后用.进行应用

    第二种是from import形式,在使用模块里的函数的时候,直接使用函数名即可,不需要带itertools的前缀

    1、 迭代器imap和map的使用

    itre = itertools.imap(pow,[1,2,3],[1,2,3])
    print itre
    for i in itre:
        print i
    li = map(pow,[1,2,3],[1,2,3])
    print li
    执行结果如下:

    <itertools.imap object at 0x7fe364cf4610>
    1
    4
    27
    [1, 4, 27]
    从结果中可以看到,imap函数返回的是一个迭代器,而map函数返回的是一个list


    2、 迭代器ifilter和filter的使用

    ifil = itertools.ifilter(lambda x:x >5 ,range(10))
    print ifil
    for i in ifil:
        print i
    ifilfalse = itertools.ifilterfalse(lambda x:x>5,range(10))
    print ifilfalse
    for i in ifilfalse:
        print i
    
    li = filter(lambda x:x>5,range(10))
    print li
    执行结果如下:

    <itertools.ifilter object at 0x7fe364cf46d0>
    6
    7
    8
    9
    <itertools.ifilterfalse object at 0x7fe364cf4750>
    0
    1
    2
    3
    4
    5
    [6, 7, 8, 9]
    从执行结果可以看到,ifilter和filter和ifilterfalse都是起到一个过滤的作用,但是ifilter和ifilterfalse都是返回一个迭代器,而filter则是返回一个列表

    3、 迭代器takewhile和dropwhile函数

    take = itertools.takewhile(lambda x:x>5,[6,2,6,7,3])
    for i in take:
        print 'this is the takewhile function ',i
    drop = itertools.dropwhile(lambda x:x>5,[1,2,6,7,3])
    for i in drop:
        print 'this is the dropwhile function ',i
    takewhile函数表示遇到true进行收集到迭代器中,遇到false之后,退出

    driopwhile函数表示遇到false的时候,跳过此元素,当true的时候收集剩余的元素,执行结果如下:

    this is the takewhile function  6
    this is the dropwhile function  1
    this is the dropwhile function  2
    this is the dropwhile function  6
    this is the dropwhile function  7
    this is the dropwhile function  3

    4、 迭代器groupby方法

    import itertools
    
    def height_alias(height):
        if height > 180:
            return 'tall'
        elif height < 160:
            return 'short'
        else:
            return 'middle'
    
    persons = [191,159,156,170,177,190,183,185]
    sorted(persons,key=height_alias)
    
    for m,n in itertools.groupby(persons,key=height_alias):
        print m
        print (list(n))
    groupby主要是将相邻的相同的元素放在一起,然后进行返回,在上述的方法中,可以看到使用sorted方法,主要是将数据进行排序,然后挑选相邻的元素将符合条件的进行输出,得到一个统计的作用,执行结果如下:

    tall
    [191]
    short
    [159, 156]
    middle
    [170, 177]
    tall
    [190, 183, 185]

    groupby(iterable [,key]):
    
    创建一个迭代器,对iterable生成的连续项进行分组,在分组过程中会查找重复项。
    
    如果iterable在多次连续迭代中生成了同一项,则会定义一个组,如果将此函数应用一个分类列表,那么分组将定义该列表中的所有唯一项,key(如果已提供)是一个函数,应用于每一项,如果此函数存在返回值,该值将用于后续项而不是该项本身进行比较,此函数返回的迭代器生成元素(key, group),其中key是分组的键值,group是迭代器,生成组成该组的所有项。


    5、 chain函数

    主要是将几个序列进行加起来,然后返回一个迭代器,itertools.chain('kel','other')

    6、 count函数

    主要输出自然序列,第一个为开始的数字,第二个参数为步长,itertools.count(2,2),输出从2开始,以2为步长的无限迭代器

    7、 cycle函数

    主要是将一个序列无限输出,重复,itertools.cycle('kel')

    8、 repeat函数

    主要是进行重复一个序列,第二个参数为重复的次数 ,itertools.repeat('kel',2)表示将序列kel重复两次的迭代器









    for linux and python
  • 相关阅读:
    java xpath
    structs2 Interceptor
    jetbrains idea web help
    Java xpath example code THE RIGHT WAY
    java xpath engine
    本地安装jruby到maven仓库,由于公司网络不给力
    skybe的linux下的版本下载
    mybastis学 rails有migration了
    Using Java from Ruby with JRuby IRB
    PropertyPlaceholderConfigurer
  • 原文地址:https://www.cnblogs.com/kellyseeme/p/5525053.html
Copyright © 2011-2022 走看看