itertools模块提供的函数大多是返回一个迭代器,以下介绍几个常用的函数
count:无限迭代器,接受两个参数,第一个参数为起始位置,第二个参数为步长
import count
for i in itertools.count(): # 不指定参数默认是从0开始,步长为1
print(i)
输出:会一直不停的输出
cycle:无限迭代器,接受一个可迭代参数
import itertools
list_ = [1,2,3,4]
for i in itertools.cycle(a):
print(i)
输出:1234一直无限循环输出
chain 接受两个可迭代参数,将两个可迭代参数的值连接在一起,返回一个迭代器
import itertools
list_1 = [1,2,3]
list_2 = [4,5,6]
print(list(itertools.chain(list_1, list_2)))
输出:
[1, 2, 3, 4, 5, 6]
filterfalse 过滤出false的选项
这个函数存在疑问,望大佬指点
import itertools
def f(x):
if x % 2 == 0:
return x
list_1 = [1,2,3,4]
print(list(itertools.filterfalse(f, list_1)))
list_2 = ["", None, 1,2,3,0]
print(list(itertools.filterfalse(None, list_2)))
list_3 = range(10)
print(list(itertools.filterfalse(lambda x:x%2, list_3)))
print(list(itertools.filterfalse(lambda x:x%2==0, list_3)))
输出:
[1, 3]
["", None, 0]
[0, 2, 4, 6, 8]
[1, 3, 5, 7, 9]
疑问:
1、list_1中函数返回的是偶数,返回的是奇数,与理解的过滤出偶数不符;
2、list_2中过滤出None,返回的是None,与理解的相符
那么问题来了,filterfalse函数返回的是符合条件的还是不符合条件的?????
3、list_3中filterfalse的第一个函数有什么区别?????
望大神指点迷津。。。。。
compress 接受两个可迭代参数,第一个参数根据第二个参数的真假性进行输出
import itertools
print(list(itertools.compress("abcd", [1,None,True])))
输出:
["a", "c"]
combinations和combinations_with_replacement 两个函数都可接受两个参数,第一个是可迭代对象,第二个是每个返回对象的长度,并且每个返回的对象是以元组的形式返回
二者的区别是combinations返回的元素没有重复的,而combinations_with_replacement 返回的元素可以是重复的
import itertools
list_ = [1,2,3,4]
print(list(itertools.combinations(list_, 2)))
print(list(itertools.combinations_with_replacement(list_, 2)))
输出:
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
[(1, 1), (1, 2), (1, 3), (1, 4), (2, 2), (2, 3), (2, 4), (3, 3), (3, 4), (4, 4)]
注意:以上述代码为例,两个函数输出的每个元组的第一个数一定在第二个数的前边
permutations 接受两个参数,第一个是可迭代对象,第二个是每个对象的长度,并且是以元组的形式返回
import itertools
a = [1,2,3,4]
print(list(itertools.permutations(a, 2)))
输出:
[(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]
注意:以上述代码为例,结果中存在(1,2)和(2,1),但是不会存在(1,2)和(2,2)这种
product 生成笛卡尔积,接受两个可迭代参数
import itertools
a = ["a", "b", "c"]
b = [1,2,3,4]
print(list(itertools.product(a,b)))
输出:
[('a', 1), ('a', 2), ('a', 3), ('a', 4), ('b', 1), ('b', 2), ('b', 3), ('b', 4), ('c', 1), ('c', 2), ('c', 3), ('c', 4)]