itertools模块知识与整理删减【Python】

来源:互联网 发布:医学生必备软件 编辑:程序博客网 时间:2024/05/02 06:45
参考链接没记下,就这么着吧。参考了几篇博文,自己再来个总结。新手可以对着学学map,reduce,zip




count(p,q)                      返回p, p+q, p+2*q, ....

cycle(p)                          返回 p[0], p[1],...p[last],p[0],p[1]......

repeat(p, n)                    返回 p...p (n times)

chain(p,q..)                     把几个参数连接起来(通通单字符化)

compress(data, selectors)             compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F   

dropwhile(pred, seq)                      dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1

takewhile(pred, seq)                    takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4



  1.    .....: for n, v in itertools.groupby('aaabbbb ccc aaaaa'):  
  2.    .....:     print n, list(v)  
  3.    .....:   
  4. a ['a''a''a']  
  5. b ['b''b''b''b']  
  6.   [' ']  
  7. c ['c''c''c']  
  8.   [' ']  
  9. a ['a''a''a''a''a']  

ifilter(pred, seq)                            ifilter(lambda x: x%2, range(10)) --> 1 3 5 7 9

ifilterfalse(pred, seq)                    ifilterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8

islice(seq, start, stop, step)           islice('ABCDEFG', 2, None) --> C D E F G

imap(fun, p, q)                             imap(pow, (2,3,10), (5,2,3)) --> 32 9 1000

izip(p,q,...)                                    izip('ABCD', 'xy') -->( 'A', 'x' ), ( 'B', 'y'  )

izip_longest(p,q,...)                      izip_longest('ABCD', 'xy', fillvalue='-') --> Ax By  C-  D-

starmap(fun, seq)                        starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000

tee(it, n)                                       将迭代器it复制n份

product(p,q,...)                             笛卡尔积

permutations(seq, r)                   permutations('ABCD', 2) -->AB AC AD BA BC BD CA CB CD DA DB DC 

combination(seq, r)                    combinations('ABCD', 2) -->AB AC AD BC BD CD

combinations_with_replacement(seq, r)    combinations_with_replacement('ABCD', 2) -->AA AB AC AD BB BC BD CC CD DD


groupby

原型:

groupby(iterable[, keyfunc])

返回:按照keyfunc函数对序列每个元素执行后的结果分组(每个分组是一个迭代器), 返回这些分组的迭代器

例子:

from itertools import *a = ['aa', 'ab', 'abc', 'bcd', 'abcde']for i, k in groupby(a, len):#按照字符串的长度对a的每个元素进行分组    for m in k:        print m,     print i

输出:

aa ab 2abc bcd 3abcde 5

starmap

原型:

starmap(func, seq)

返回:对序列seq的每个元素作为func的参数列表执行, 返回执行结果的迭代器

例子:

from itertools import *for i in starmap(pow, [(2,2), (3, 2)]):#4, 9    print i

product

原型:

product(iter1, iter2, ... iterN, [repeat=1])

创建一个迭代器,生成表示item1,item2等中的项目的笛卡尔积的元组,repeat是一个关键字参数,指定重复生成序列的次数

from itertools import *for i in product([1, 2, 3], [4, 5], [6, 7]):    print i

输出:

(1, 4, 6)(1, 4, 7)(1, 5, 6)(1, 5, 7)(2, 4, 6)(2, 4, 7)(2, 5, 6)(2, 5, 7)(3, 4, 6)(3, 4, 7)(3, 5, 6)(3, 5, 7)
扩展功能
def take(n, iterable):    "Return first n items of the iterable as a list"    return list(islice(iterable, n))def tabulate(function, start=0):    "Return function(0), function(1), ..."    return imap(function, count(start))def consume(iterator, n):    "Advance the iterator n-steps ahead. If n is none, consume entirely."    # Use functions that consume iterators at C speed.    if n is None:        # feed the entire iterator into a zero-length deque        collections.deque(iterator, maxlen=0)    else:        # advance to the empty slice starting at position n        next(islice(iterator, n, n), None)def nth(iterable, n, default=None):    "Returns the nth item or a default value"    return next(islice(iterable, n, None), default)def quantify(iterable, pred=bool):    "Count how many times the predicate is true"    return sum(imap(pred, iterable))def padnone(iterable):    """Returns the sequence elements and then returns None indefinitely.    Useful for emulating the behavior of the built-in map() function.    """    return chain(iterable, repeat(None))def ncycles(iterable, n):    "Returns the sequence elements n times"    return chain.from_iterable(repeat(tuple(iterable), n))def dotproduct(vec1, vec2):    return sum(imap(operator.mul, vec1, vec2))def flatten(listOfLists):    "Flatten one level of nesting"    return chain.from_iterable(listOfLists)def repeatfunc(func, times=None, *args):    """Repeat calls to func with specified arguments.    Example:  repeatfunc(random.random)    """    if times is None:        return starmap(func, repeat(args))    return starmap(func, repeat(args, times))def pairwise(iterable):    "s -> (s0,s1), (s1,s2), (s2, s3), ..."    a, b = tee(iterable)    next(b, None)    return izip(a, b)def grouper(iterable, n, fillvalue=None):    "Collect data into fixed-length chunks or blocks"    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx    args = [iter(iterable)] * n    return izip_longest(fillvalue=fillvalue, *args)def roundrobin(*iterables):    "roundrobin('ABC', 'D', 'EF') --> A D E B F C"    # Recipe credited to George Sakkis    pending = len(iterables)    nexts = cycle(iter(it).next for it in iterables)    while pending:        try:            for next in nexts:                yield next()        except StopIteration:            pending -= 1            nexts = cycle(islice(nexts, pending))def powerset(iterable):    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"    s = list(iterable)    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))def unique_everseen(iterable, key=None):    "List unique elements, preserving order. Remember all elements ever seen."    # unique_everseen('AAAABBBCCDAABBB') --> A B C D    # unique_everseen('ABBCcAD', str.lower) --> A B C D    seen = set()    seen_add = seen.add    if key is None:        for element in ifilterfalse(seen.__contains__, iterable):            seen_add(element)            yield element    else:        for element in iterable:            k = key(element)            if k not in seen:                seen_add(k)                yield elementdef unique_justseen(iterable, key=None):    "List unique elements, preserving order. Remember only the element just seen."    # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B    # unique_justseen('ABBCcAD', str.lower) --> A B C A D    return imap(next, imap(itemgetter(1), groupby(iterable, key)))def iter_except(func, exception, first=None):    """ Call a function repeatedly until an exception is raised.    Converts a call-until-exception interface to an iterator interface.    Like __builtin__.iter(func, sentinel) but uses an exception instead    of a sentinel to end the loop.    Examples:        bsddbiter = iter_except(db.next, bsddb.error, db.first)        heapiter = iter_except(functools.partial(heappop, h), IndexError)        dictiter = iter_except(d.popitem, KeyError)        dequeiter = iter_except(d.popleft, IndexError)        queueiter = iter_except(q.get_nowait, Queue.Empty)        setiter = iter_except(s.pop, KeyError)    """    try:        if first is not None:            yield first()        while 1:            yield func()    except exception:        passdef random_product(*args, **kwds):    "Random selection from itertools.product(*args, **kwds)"    pools = map(tuple, args) * kwds.get('repeat', 1)    return tuple(random.choice(pool) for pool in pools)def random_permutation(iterable, r=None):    "Random selection from itertools.permutations(iterable, r)"    pool = tuple(iterable)    r = len(pool) if r is None else r    return tuple(random.sample(pool, r))def random_combination(iterable, r):    "Random selection from itertools.combinations(iterable, r)"    pool = tuple(iterable)    n = len(pool)    indices = sorted(random.sample(xrange(n), r))    return tuple(pool[i] for i in indices)def random_combination_with_replacement(iterable, r):    "Random selection from itertools.combinations_with_replacement(iterable, r)"    pool = tuple(iterable)    n = len(pool)    indices = sorted(random.randrange(n) for i in xrange(r))    return tuple(pool[i] for i in indices)def tee_lookahead(t, i):    """Inspect the i-th upcomping value from a tee object    while leaving the tee object at its current position.    Raise an IndexError if the underlying iterator doesn't    have enough values.    """    for value in islice(t.__copy__(), i, None):        return value    raise IndexError(i)
0 0
原创粉丝点击