无限 迭代器

count(start, step)

  • 起点开始,无穷迭代, 每次返回值(yield)增加给定 step

    1
    2
    
    itertools.count(1)
    itertools.count(1, 3)

cycle(iterable)

  • 提供的材料,被无穷迭代

    1
    2
    
    itertools.cycle([1, 2, 3])
    itertools.cycle('ABC')

repeat(object, times_count)

  • 给定元素,被迭代 N 次

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

有限次迭代

accumulate(iterable, [func, *, initial=None])

  • 分步运算,迭代器
  • 相当于 reduce, 返回每一步的运行结果

    1
    
    itertools.accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120

chain(iterableA, iterableB, …)

  • 迭代器 – 连接器
  • 把 输入的多个 Iterable 连接起来

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

chain.chain_from_iterable(iterable)

  • 迭代器 – 连接器
  • 相当于 使用 列表先手动组合多个 Iterable

    1
    2
    
    chain('ABC', 'DEF') --> A B C D E F
    <---> chain.from_iterable(['ABC', 'DEF'])

compress(data, selectors)

  • 元素提取器
  • 用第二个列表中给定的 indexes, 从第一个列表中提取元素

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

dropwhile(predicate, sequence) —> 与 takewhile 相反

  • 保留结尾
  • 无效开始触发,迭代器

    • 从第一个无效的元素,开始连续返回(后面的不再判断)
    • 这个无效的也留下
1
dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1

takewhile(predicate, sequence) —> 与 dropwhile 相反

  • 保留开头
  • 无效中止,迭代器

    • 第一个无效的开始,都不要了(后面的全不要)
    • 这个无效的也不要了
1
2
In [71]: list(itertools.takewhile(lambda x: x<5, [1,4,6,4,1]))
Out[71]: [1, 4]

filterfalse(prdicate, sequence)

  • filter 函数的 相反工具

groupby(sequence, key=your_keyfun)

效果举例:

1
2
# [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

islice

  • 元素切片器
  • 名称意思

    • islice –> index slice
    • 使用类似 range(start, stop, step) 生成的 index 对 iterable 切片
  • 用法

    • islice(iterable, stop)
    • islice(iterable, start, stop[, step])

      1
      
      islice('ABCDEFG', 0, None, 2) --> A C E G
    • None 含意

      • start –> None –> 0
      • stop —> None –> -1

starmap(func, sequence)

  • map, 嵌套使用模式

    • map 的 func(* elem) 形式

      • map(func, sequenceA, sequenceB)
    • func = lambda x, y: …

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

tee(iterable, N)

zip_longest(*iterables, fillvalue=None)

  • zip() 函数的优化

    • 在原始 zip() 中,当两个操作 iterable 不等长时,会失败
    • 这里使用 fillvalue 进行填充 较短的那个

      1
      
      zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-

排列组合

product()

  • 笛卡儿积 组合

permutations()

  • 排列

combinations()

  • 组合

    • 无放回的组合

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

combinations_with_replacement()

  • 组合

    • 有放回的组合

      1
      2
      3
      
      combinations_with_replacement('ABCD', 2)
      
      AA AB AC AD BB BC BD CC CD DD
      • 注意

        • 可以看出,这里会出现重复元素的组合