itertools模块中一些实用的方法
accumulate()——累加
有一道数学题,在'1, 3, 6, 10, 15, ?, 28, 36, 45, 55'这一串数字中,'?'处的数字是多少?
这是一道小学数学题!它的规律很简单,第一个位置的数是1=1,第二个位置的数为3=1+2,第三个位置的数为6=1+2+3,第四个...
在Python中,每个数的位置即是每个元素的下标,[1,2,3,4,5,6,7,8,9,10],那么我们根据每个元素的下标即可算出这个元素是多少。
正常的for循环方法:
def func(nums):
sumn = 0
list1 = []
for i in nums:
sumn += i
list1.append(sumn)
return list1
print(func([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
更好的accumulate()方法:
from itertools import accumulate
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sumn = accumulate(nums)
print(list(sumn))
运行结果:
[1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
accumulate(iterable, func, *, initial=None)中的参数
accumulate(iterable, func, *, initial=None),其中iterable为迭代器;func表示一个具有两个参数的函数,默认为加法运算;initial表示关键字参数,默认为None。
例如,有一个列表[1,3,2,4],要求生成一个用每个元素及其前面元素中的最大值表示当前位置的值。
for循环方法:
def func(nums):
for i in range(1, len(nums)): # 第一个元素一定是它自己
if nums[i] < nums[i-1]:
nums[i] = nums[i-1]
return nums
print(func([1,3,2,4]))
accumulate()方法:
from itertools import accumulate
nums = [1, 3, 2, 4]
new = accumulate(nums, max)
print(list(new))
compress(data, selectors)
制作一个迭代器,从数据中筛选出仅返回在选择器元素的元素的迭代器。当数据或可迭代项用尽时停止。简单来说,就是一个容器存储数据,另一个容器存储对应位置数据元素的存在状态。
其中参数data表示数据,selectors表示选择器。
例如,nums1=['a','b','c','d']表示有a、b、c、d四个元素,nums2=[1,0,1,0]表示元素的存在状态,其中0表示不存在,1表示存在。现在需要我们求出存在的元素。
for循环方法:
def func(nums1, nums2):
n = len(nums1)
list1 = []
for i in range(n):
if nums2[i] == 1:
list1.append(nums1[i])
return list1
print(func(nums1 = ['a','b','c','d'], nums2 = [1, 0, 1, 0]))
compress方法:
from itertools import compress
nums1 = ['a','b','c','d']
nums2 = [1, 0, 1, 0]
print(list(compress(nums1, nums2)))
运行结果:
['a', 'c']
使用手册:https://docs.python.org/3.7/library/itertools.html#itertools.accumulate