欢迎光临散文网 会员登陆 & 注册

Python基础:从迭代器操作看整体和局部(一)

2023-05-06 00:06 作者:扣丁船  | 我要投稿

迭代器,简单来说就是可以一个可以装很多东西的容器,并且这些东西可以逐个拿出来。在python中典型的就是list列表。

如平常使用的众多工具一样,python中也针对数组(迭代器)聚合运算给出了标准的函数(或称API),常见的有求和、求个数、求最大值,求最小值,均值等。

简单计算

例如有一个由1,2,3,4构成的数组,针对其做以上操作如下所示。

列表如下:

求和:

求个数:

也就是求得该列表的长度。

求均值:

内置函数中没有直接给出,但是有了上面两个可以求出的条件,此问题也不是问题。

求最大值:

求最小值:

这些简单的计算,基本没有难度,如果要总结下就是:函数中直接传入迭代器,返回想要的结果。

但其实python中封装的迭代器操作函数,有比这高级的用法。


复杂计算

所说高级用法,也就是说,在这些元素不是1,2,3,4这些简单的数字元素时,而是dict字典、子列表这些更具完整信息的元素时,怎么根据这些完整元素的部分特征,取出某个元素来。比如有以下一个字典元素构成的数组:

如果想要根据这些字典局部特征count进行对比,取得该局部最大值对应的整体元素(字典)。

python在max函数中的另外一个参数key就可以起作用了,本质上传入的是一个函数,简单来讲,就像一个回调函数一样,被传到max函数中,告诉max这个函数,需要用哪个指标来进行比较。

当然这个指标可以直接被指定为比如上面的count,当然也可以再被加工算一下得到的结果,比如让这个count加1或者其他的计算,每个元素的count都按照这个规则计算一下之后比较,该指标最大,那么就将这个对应的元素返回。注意:不是返回这个元素的局部特征值(比如count)而是完整的元素。也就是这里的字典dict,比如{"name": "Tom", "count": 5, "sub": {"count": 2}},。

示例:

因为所有元素中count最大的是第一条,所以比较之后,返回第一个字典。

既然可以取某个局部特征值,上面的每一个字典,还有一个嵌套字典sub,这个里面也有一个count,那它当然也应该可以用来作比较。

比较列表中的每个字典,取出字典中的sub key值,count值依次为2,1,4,5,3.

子字典值比较

很显然第4个元素的该值是最大的。即

上面的例子中地迭代器的元素是字典,当然还可以是其他的类型,比如子数组,更一般的就是一个python对象,包括自定义的一些类型。


元素为子列表

以下是一个元素为列表的列表(迭代器)。

还是以求max为例,比如要求针对每个子列表的第二个元素为标准,找出该特征值最大值对应的元素。

直观比较可知道答案。

lambda x: x[1]是一个匿名函数,这里函数参数是x, 输出是冒号后面的表达式x[1], 比如输入的x为[1,4, 2], 那么函数返回的结果为x[1] = 4。

前面讲到,这个匿名函数整体作为一个回调函数传入max中,这个处理机制可以理解为以下的过程。

1、遍历arr1中的每个元素;

2、将当前元素作为入参传入匿名函数;

3、匿名函数输出结果,放入一个新的迭代器,顺序还是元素保持一致;

4、找出新迭代器最大值,为5,并记录其索引为3.

5、带着找出的索引3取到原迭代器中的元素为[3,5,1].


元素为自定义类型

以下是一个自定义的类:

通过实例化该类,组成一个新的列表arr:

类比以上操作,找出属性count最大对应的实例是哪个。


总结:

1、需求场景:在一个迭代器中,需要根据元素的局部特征,比如字典的某个key或者对象的某个属性,根据某个规则,选择对应的元素;

2、前提条件:迭代器中的所有元素,需要结构一致,不能缺失作为规则判断依据的局部特征;

3、想法:这里给人的感觉是,一个局部的特征决定了整个的状态,比如学生时代考试,按某个科目排序,可以选出一个第一名,比如数学,选出的是这个人,而不是这个分数本身;按不同的维度又会选择不同的个体出来;在某个领域,某个个人特质就决定了某个人的高度。



Python基础:从迭代器操作看整体和局部(一)的评论 (共 条)

分享到微博请遵守国家法律