python中的enumerate、map、filter和zip函数
引入
python内置了很多可以供我们直接调用的函数,这些函数的效率往往都非常高。我们在自己造轮子的同时,也非常有必要了解并且正确使用python给我们提供的大量的内置函数。在前面的博客里面我已经介绍了collections模块里面的几个比较常用的函数,这里再介绍几个。
1.enumerate
enumerate(iterable, start=0) :对指定的对象进行枚举
返回一个枚举对象。 iterable 必须是一个序列,或 iterator ,或其他支持迭代的对象。 enumerate() 返回的迭代器的 __next__() 方法返回一个元组,里面包含一个计数值(从 start 开始,默认为 0)和通过迭代 iterable 获得的值。
注: iterable 指的是可迭代对象, iterator 指的是迭代器,需要注意的是可迭代对象不一定是迭代器,而迭代器一定是可迭代对象,迭代器需要实现 __next__() 方法。
例:
names = ['zhangsan', 'lisi', 'wangwu'] print(list(enumerate(names)))
# [(0, 'zhangsan'), (1, 'lisi'), (2, 'wangwu')] print(list(enumerate(names, start=1)))
# [(1, 'zhangsan'), (2, 'lisi'), (3, 'wangwu')]
相当于:
def enumerate(sequence, start=0):
n = start
for elem in sequence:
yield n, elem
n += 1
2.map
map(function, iterable, ...) : 作用是将一个列表映射到另一个列表
对参数 iterable 中每个元素都调用funcion(函数),并返回输出其结果的迭代器。 如果传入了额外的 iterable 参数,function必须接受相同个数的实参。 当有多个可迭代对象时,最短的可迭代对象耗尽则整个迭代就将结束。
例1:
print(list(map(lambda x:x+1,[1,2,3])))
# [2, 3, 4]
注意:因为返回的是可迭代对象,所以需要调用list来显示。
例2:
def add(n, m):
return n + m lst = list(map(add, [1, 2, 3], [1, 2, 3]))
print(lst) # [2, 4, 6]
例3:
# map(x, y) 返回x的y次幂
lst = map(pow, [1, 2, 3], [1, 2, 3])
print(list(lst)) # [1, 4, 27]
3.filter
filter(function, iterable) :对指定序列执行过滤操作
filter函数会对序列参数 iterable 中的每个元素调用function函数,最后返回的结果包含调用结果为True的元素。
返回一个迭代器,需要用list调用来显示所有结果。
例1:
print(list(filter((lambda x: x>0), range(-5, 5))))
# [1, 2, 3, 4]
例2:
print(list(fliter(None, range(-2, 2))))
# [-2, -1, 1]
例3:
def func(x):
# 返回同时不能被2和3整除的元素
return x % 2 != 0 and x % 3 != 0 print(list(filter(func, range(2,25))))
# [5, 7, 11, 13, 17, 19, 23]
4.zip
zip(*iterables) :用来创建一个聚合了每个可迭代对象中的元素的迭代器。
接受一系列可迭代对象作为参数,将对象中对应的元素打包成一个个tuple,然后返回由这些tuples组成的迭代器。若传入参数的长度不相等,以长度最短的可迭代对象为准。
例1:
print(list(zip([1, 2, 3], [4, 5, 6])))
# [(1, 4), (2, 5), (3, 6)]
例2:
print(list(zip([1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11, 12])))
# [(1, 4, 8), (2, 5, 9), (3, 6, 10)]
应用一:矩阵变换
"""
初始:
1 2 3
4 5 6
7 8 9
变换:
1 4 7
2 5 8
3 6 9
""" matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print([[row[col] for row in matrix] for col in range(len(matrix[0]))]) # 行变列
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]] print(list(zip(*matrix)))
# [(1, 4, 7), (2, 5, 8), (3, 6, 9)] print(list(map(list, zip(*matrix))))
# [[1 ,4 ,7], [2, 5, 8], [3, 6, 9]]
应用二:*操作符与zip函数配合可以实现与zip相反的功能,即将合并的序列拆成多个tuple
x=[1,2,3]
y=['a','b','c']
print(list(zip(*zip(x,y))))
# [(1,2,3),('a','b','c')]
应用三:使用zip合并相邻的列表项
a = [1, 2, 3, 4, 5, 6] print(list(zip(*([iter(a)] * 2))))
# [(1, 2), (3, 4), (5, 6)] group_adjacent = lambda a, k: zip(*([iter(a)] * k))
print(list(group_adjacent(a, 3)))
# [(1, 2, 3), (4, 5, 6)] print(list(group_adjacent(a, 2)))
# [(1, 2), (3, 4), (5, 6)] print(list(group_adjacent(a, 1)))
# [(1,), (2,), (3,), (4,), (5,), (6,)] print(list(zip(a[::2], a[1::2])))
# [(1, 2), (3, 4), (5, 6)] print(list(zip(a[::3], a[1::3], a[2::3])))
# [(1, 2, 3), (4, 5, 6)] group_adjacent = lambda a, k: zip(*(a[i::k] for i in range(k)))
print(list(group_adjacent(a, 3)))
# [(1, 2, 3), (4, 5, 6)] print(list(group_adjacent(a, 2)))
# [(1, 2), (3, 4), (5, 6)]
应用四:使用zip和iterators生成滑动窗口 (n -grams)
from itertools import islice # islice(iterable, [start, ] stop [, step]),将跳过前start个项,迭代在stop所指定的位置停止,step指定用于跳过项的步幅。
def n_grams(a, n):
z = (islice(a, i, None) for i in range(n)) #当n为3时z可以看作:((1, 2, 3, 4, 5, 6), (2, 3, 4, 5, 6), (3, 4, 5, 6))
return zip(*z) a = [1, 2, 3, 4, 5, 6]
print(list(n_grams(a, 3)))
#[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6)] print(list(n_grams(a, 2)))
#[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)] print(list(n_grams(a, 4)))
#[(1, 2, 3, 4), (2, 3, 4, 5), (3, 4, 5, 6)]
应用五:使用zip反转字典
m = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
print(list(m.items()))
#[('a', 1), ('c', 3), ('b', 2), ('d', 4)]
print(list(zip(m.values(), m.keys())))
#[(1, 'a'), (3, 'c'), (2, 'b'), (4, 'd')]
print(dict(zip(m.values(), m.keys())))
#{1: 'a', 2: 'b', 3: 'c', 4: 'd'}
~>.<~
python中的enumerate、map、filter和zip函数的更多相关文章
- Python面试题之Python中的lambda map filter reduce zip
当年龟叔想把上面列出来的这些都干掉.在 “All Things Pythonic: The fate of reduce() in Python 3000”这篇文章中,他给出了自己要移除lambda. ...
- python常用函数进阶(2)之map,filter,reduce,zip
Basic Python : Map, Filter, Reduce, Zip 1-Map() 1.1 Syntax # fun : a function applying to the iterab ...
- 揭秘 Python 中的 enumerate() 函数
原文:https://mp.weixin.qq.com/s/Jm7YiCA20RDSTrF4dHeykQ 如何以去写以及为什么你应该使用Python中的内置枚举函数来编写更干净更加Pythonic的循 ...
- [转]关于python中带下划线的变量和函数的意义
Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...
- Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
Python中字符串String的基本内置函数与用法 首先我们要明白在python中当字符编码为:UTF-8时,中文在字符串中的占位为3个字节,其余字符为一个字节 下面就直接介绍几种python中字符 ...
- 关于Python中的类普通继承与super函数继承
关于Python中的类普通继承与super函数继承 1.super只能用于新式类 2.多重继承super可以保公共父类仅被执行一次 一.首先看下普通继承的写法 二.再看看super继承的写法 参考链接 ...
- python中lambda以及与filter/map/reduce结合的用法
一.lambda函数即匿名函数,和普通的函数相比,就是省去了函数名称而已: lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边是函数体的返回值 g = lambda x,y : x+y ...
- 2018.8.15 python 中的sorted()、filter()、map()函数
主要内容: 1.lambda匿名函数 2.sorted() 3.filter() 4.map() 5.递归函数 一. lambda匿名函数 为了解决一些简单的需求而设计的一句话函数 # 计算n的n次方 ...
- Python中的enumerate函数的作用
enumerate函数是将一个可迭代对象中元素,按元素顺序每个增加一个索引值,将其组成一个索引序列,利用它可以同时获得索引和值,这样做的目的是为了将一个可迭代对象中元素组成一个"索引,值&q ...
随机推荐
- Jmeter If控制器
"${xxx}"=="1" 或者 "${xxx}"!="2"
- 云原生生态周报 Vol. 6 | KubeCon EU 特刊
5 月 26日,2019 年第一个 KubeCon + CloudNativeCon 在巴塞罗那成功闭幕.本届 KubeCon 共吸引了超过 7700 名与会者,相较去年哥本哈根大会的 4300 余名 ...
- Lecture Collection
Distributed ML Yibo Zhu 主要讲了如何分布式的进行机器学习,主要用到的思想是指令的流水调度的相关的思想. IoT Zhenjiang Li 普通的各种卡是基于PIN来进行身份验证 ...
- px em rem %作为单位使用
博客地址 :https://www.cnblogs.com/sandraryan/ px 我们都很熟悉啦,但是固定大小无法适配各种屏幕. rem是CSS3新增的一个相对单位(root em,根em), ...
- Element-ui学习笔记3--Form表单(一)
Radio单选框 要使用 Radio 组件,只需要设置v-model绑定变量,选中意味着变量的值为相应 Radio label属性的值,label可以是String.Number或Boolean. & ...
- 什么是响应式设计?响应式设计的基本原理是什么?如何兼容低版本的 IE?
响应式网站设计(Responsive Web design)的理念是:集中创建页面的图片排版大小,可以智能地根据用户行为以及 使用的设备环境(系统平台.屏幕尺寸.屏幕定向等)进行相对应的布局,无论用户 ...
- hihocoder 1272 买零食
#1272 : 买零食 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho很喜欢在课间去小卖部买零食.然而不幸的是,这个学期他又有在一教的课,而一教的小卖部姐姐以冷若冰 ...
- H3C 示例:计算子网地址
- Roslyn 使用 Target 替换占位符方式生成 nuget 打包
本文告诉大家如何编写在编译过程修改打包文件 在项目文件的相同文件夹可以放一个 nuspec 用来告诉 VisualStudio 如何打包 现在尝试创建一个项目 NearjerbetearDeeyito ...
- 正则&转义字符&特殊字符
正则 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 由于正则表达式主要应用对 ...