python:itertools模块

197 阅读4分钟

itertools方法

chain(*iterables) 此函数创建一个新迭代器来将所有的迭代器链接起来,返回的迭代器从iter1开始生成项,知道iter1被用完,然后从iter2生成项,这一过程会持续到iterN中所有的项都被用完。

from itertools import chain
test = chain('AB', 'CDE', 'F')
for el in test:
  print el
-------------result---------------------
A
B
C
D
E
F

combinations(iterable, r) 创建一个迭代器,返回iterable中所有长度为r的子序列,返回的子序列中的项按输入iterable中的顺序排序:

test = itertools.combinations([1,2,3,4], 2)
for i in test:
    print(i)
-------------------------------------------
(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)

combinations_with_replacement(iterable, r) 返回迭代器中元素的连续r长度组合允许单个元素有连续的重复。

test = itertools.combinations_with_replacement([1,2,3], 2)
for i in test:
    print(i)
------------------------------------------------------
(1, 1)
(1, 2)
(1, 3)
(2, 2)
(2, 3)
(3, 3)

islice() 函数返回一个迭代器,按照索引从输入迭代器返回所选择的元素

for i in islice(range(10), 5):
    print(i)
for i in islice(range(100), 0, 100, 20):
    print(i)
-----------------result-------------------------
0
1
2
3
4
---
0
20
40
60
80

tee() 返回一个迭代器可以用来为并行处理的多个算法提供相同的数据集,tee返回一个新的迭代器后不应该使用之前的迭代器,因为当原迭代器被消耗之后新的迭代器则不会生成被使用的值

r = islice(count(), 5)
r1, r2 = tee(r)
print(list(r1))
print(list(r2))
-------------------
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]

count(start=0, step=1) 不停的生成新值

cycle() 返回一个迭代器,会无限地重复给定参数的内容

for i in zip(range(5), cycle(['a','b','c'])):
    print(i)
-----------------------------------------
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'a')
(4, 'b')

repeat() 函数返回一个迭代器,每次访问时会生成相同的值

for i in repeat('handsome',5):
    print(i)
--------------------------------
handsome
handsome
handsome
handsome
handsome

for i in map(lambda x,y: (x,y,x*y), repeat(2), range(10)):
    print(f'{i[0]}*{i[1]}={i[2]}')
--------------------------------------------
2*0=0
2*1=2
2*2=4
2*3=6
2*4=8
2*5=10
2*6=12
2*7=14
2*8=16
2*9=18

dropwhile(function, iterable) 返回一个不满条件的迭代器(第一次条件为false之后输入的其余都会全部返回)

test = dropwhile(lambda x:x<2, [-1,0,1,3,2,0,1])
print(list(test))
---------------------------------------------
[3, 2, 0, 1]

takewhile(functin, iterable) 返回一个满足条件的迭代器(第一次条件为false则停止输入)

test = takewhile(lambda x:x>=2, [2,3,4,-1,5])
print(list(test))
------------------------------------------------------
[2, 3, 4]

filterfalse() 返回一个迭代器,其中只包含测试条件不成立的对应元素

test = filterfalse(lambda x:x%2, [1,2,3,4])
print(list(test))
-----------------------------------------
[2,4]

compress(data, selectors) 返回true值的数据

test = compress(range(10), cycle([False,True,False]))
print(list(test))
-----------------------------------------------------
[1, 4, 7]

groupby() 返回一个迭代器,会生成一个公共键组织的集值(前提是排序后)

a = cycle(islice(count(), 3))
b = islice(count(), 7)
c = list(zip(a, b))
# 未排序
for k,g in groupby(c, lambda c:c[0]):
    print(k, list(g))
# 排序
c.sort()
for k,g in groupby(c, lambda c:c[0]):
    print(k, list(g))
----------------------------------------
# 未排序
0 [(0, 0)]
1 [(1, 1)]
2 [(2, 2)]
0 [(0, 3)]
1 [(1, 4)]
2 [(2, 5)]
0 [(0, 6)]
# 排序后
0 [(0, 0), (0, 3), (0, 6)]
1 [(1, 1), (1, 4)]
2 [(2, 2), (2, 5)]

accumulate() 处理输入迭代器,将第n个和第n+1个元素相加并返回,适合用来生成一个数值输入序列的累加和

print(list(accumulate(range(1,6,2))))
print(list(accumulate('abc')))
print(list(accumulate('abc', lambda a,b: a+b+a)))
------------------------------
[1, 4, 9]
['a', 'ab', 'abc']
['a', 'aba', 'abacaba']

product() 生成的值是元组, 第一个元组包含各个迭代器的第一个值,传入product的最后一个迭代器优先处理

a= [1,2,3,4]
b= ['a','b']
test = product(a,b)
print(list(test))
# 指定一个迭代器重复的次数repeat
test = product(range(3), repeat=2)
print(list(test))
----------------------------
[(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b'), (3, 'a'), (3, 'b'), (4, 'a'), (4, 'b')]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

permutations() 排列给定的序列

def show(iterable):
    first = None
    for i, item in enumerate(iterable, 1):
        if first != item[0]:
            if first is not None:
                print()
            first = item[0]
        print(''.join(item), end=' ')
    print()

show(permutations('abcd'))
# r参数来限制各个排列的长度和个数
show(permutations('abcd', r=2))
------------------------------------------
abcd abdc acbd acdb adbc adcb
bacd badc bcad bcda bdac bdca
cabd cadb cbad cbda cdab cdba
dabc dacb dbac dbca dcab dcba
# r参数来限制各个排列的长度和个数
ab ac ad
ba bc bd
ca cb cd
da db dc

combinations() 组合给定的序列,输入的成员唯一,返回的结果就不会重复

def show(iterable):
    first = None
    for i, item in enumerate(iterable, 1):
        if first != item[0]:
            if first is not None:
                print()
            first = item[0]
        print(''.join(item), end=' ')
    print()

show(combinations('abcd', r=2))  # r必须传
--------------------------------------------
ab ac ad
bc bd
cd

combinations_with_replacement() 组合给定的序列,允许单个元素重复

def show(iterable):
    first = None
    for i, item in enumerate(iterable, 1):
        if first != item[0]:
            if first is not None:
                print()
            first = item[0]
        print(''.join(item), end=' ')
    print()

show(combinations_with_replacement('abcd', r=2))  # r必须传
---------------------------------------------------------
aa ab ac ad
bb bc bd
cc cd
dd