您现在的位置: 万盛学电脑网 >> 程序编程 >> 网络编程 >> 编程语言综合 >> 正文

Python itertools模块详解

作者:佚名    责任编辑:admin    更新时间:2022-06-22

   篇文章主要介绍了Python itertools模块详解,本文基本是基于文档的翻译和补充,相当于翻译了,需要的朋友可以参考下

  这货很强大, 必须掌握

  文档 链接 http://docs.python.org/2/library/itertools.html

  pymotw 链接 http://pymotw.com/2/itertools/

  基本是基于文档的翻译和补充,相当于翻译了

  itertools用于高效循环的迭代函数集合

  组成

  总体,整体了解

  无限迭代器

   代码如下:

  迭代器 参数 结果 例子

  count() start, [step] start, start+step, start+2*step, ... count(10) --> 10 11 12 13 14 ...

  cycle() p p0, p1, ... plast, p0, p1, ... cycle('ABCD') --> A B C D A B C D ...

  repeat() elem [,n] elem, elem, elem, ... endlessly or up to n times repeat(10, 3) --> 10 10 10

  处理输入序列迭代器

  代码如下:

  迭代器 参数 结果 例子

  chain() p, q, ... p0, p1, ... plast, q0, q1, ... chain('ABC', 'DEF') --> A B C D E F

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

  dropwhile() pred, seq seq[n], seq[n+1], starting when pred fails dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1

  groupby() iterable[, keyfunc] sub-iterators grouped by value of keyfunc(v)

  ifilter() pred, seq elements of seq where pred(elem) is True ifilter(lambda x: x%2, range(10)) --> 1 3 5 7 9

  ifilterfalse() pred, seq elements of seq where pred(elem) is False ifilterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8

  islice() seq, [start,] stop [, step] elements from seq[start:stop:step] islice('ABCDEFG', 2, None) --> C D E F G

  imap() func, p, q, ... func(p0, q0), func(p1, q1), ... imap(pow, (2,3,10), (5,2,3)) --> 32 9 1000

  starmap() func, seq func(*seq[0]), func(*seq[1]), ... starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000

  tee() it, n it1, it2 , ... itn splits one iterator into n

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

  izip() p, q, ... (p[0], q[0]), (p[1], q[1]), ... izip('ABCD', 'xy') --> Ax By

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

  组合生成器

   代码如下:

  迭代器 参数 结果

  product() p, q, ... [repeat=1] cartesian product, equivalent to a nested for-loop

  permutations() p[, r] r-length tuples, all possible orderings, no repeated elements

  combinations() p, r r-length tuples, in sorted order, no repeated elements

  combinations_with_replacement() p, r r-length tuples, in sorted order, with repeated elements

  product('ABCD', repeat=2) AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD

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

  combinations('ABCD', 2) AB AC AD BC BD CD

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

  第一部分

  itertools.count(start=0, step=1)

  创建一个迭代器,生成从n开始的连续整数,如果忽略n,则从0开始计算(注意:此迭代器不支持长整数)

  如果超出了sys.maxint,计数器将溢出并继续从-sys.maxint-1开始计算。

  定义

  代码如下:

  def count(start=0, step=1):

  # count(10) --> 10 11 12 13 14 ...

  # count(2.5, 0.5) -> 2.5 3.0 3.5 ...

  n = start

  while True:

  yield n

  n += step

  等同于(start + step * i for i in count())

  使用

   代码如下:

  from itertools import *

  for i in izip(count(1), ['a', 'b', 'c']):

  print i

  (1, 'a')

  (2, 'b')

  (3, 'c')

  itertools.repeat(object[, times])

  创建一个迭代器,重复生成object,times(如果已提供)指定重复计数,如果未提供times,将无止尽返回该对象。

  定义

   代码如下:

  def repeat(object, times=None):

  # repeat(10, 3) --> 10 10 10

  if times is None:

  while True:

  yield object

  else:

  for i in xrange(times):

  yield object

  使用

   代码如下:

  from itertools import *

  for i in repeat('over-and-over', 5):

  print i

  over-and-over

  over-and-over

  over-and-over

  over-and-over

  over-and-over

  第二部分

  itertools.chain(*iterables)

  将多个迭代器作为参数, 但只返回单个迭代器, 它产生所有参数迭代器的内容, 就好像他们是来自于一个单一的序列.

  代码如下:

  def chain(*iterables):

  # chain('ABC', 'DEF') --> A B C D E F

  for it in iterables:

  for element in it:

  yield element

  使用

   代码如下:

  from itertools import *

  for i in chain([1, 2, 3], ['a', 'b', 'c']):

  print i

  1

  2

  3

  a

  b

  c

  from itertools import chain, imap

  def flatmap(f, items):

  return chain.from_iterable(imap(f, items))

  >>> list(flatmap(os.listdir, dirs))

  >>> ['settings.py', 'wsgi.py', 'templates', 'app.py',

  'templates', 'index.html, 'config.json']

  itertools.compress(data, selectors)

  提供一个选择列表,对原始数据进行筛选

   代码如下:

  def compress(data, selectors):

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

  return (d for d, s in izip(data, selectors) if s)

  itertools.dropwhile(predicate, iterable)

  创建一个迭代器,只要函数predicate(item)为True,就丢弃iterable中的项,如果predicate返回False,就会生成iterable中的项和所有后续项。

  即:在条件为false之后的第一次, 返回迭代器中剩下来的项.

   代码如下:

  def dropwhile(predicate, iterable):

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

  iterable = iter(iterable)

  for x in iterable:

  if not predicate(x):

  yield x

  break

  for x in iterable:

  yield x

  使用

  代码如下:

  from itertools import *

  def should_drop(x):

  print 'Testing:', x

  return (x<1)

  for i in dropwhile(should_drop, [ -1, 0, 1, 2, 3, 4, 1, -2 ]):

  print 'Yielding:', i

  Testing: -1

  Testing: 0

  Testing: 1

  Yielding: 1

  Yielding: 2

  Yielding: 3

  Yielding: 4

  Yielding: 1

  Yielding: -2

  itertools.groupby(iterable[, key])

  返回一个产生按照key进行分组后的值集合的迭代器.

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

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

  等价于

   代码如下:

  class groupby(object):

  # [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B

  # [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D

  def __init__(self, iterable, key=None):

  if key is None:

  key = lambda x: x

  self.keyfunc = key

  self.it = iter(iterable)

  self.tgtkey = self.currkey = self.currvalue = object()

  def _