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‘}

~>.<~

原文地址:https://www.cnblogs.com/pungchur/p/12152556.html

时间: 2024-11-06 07:49:43

python中的enumerate、map、filter和zip函数的相关文章

关于Python中的类普通继承与super函数继承

关于Python中的类普通继承与super函数继承 1.super只能用于新式类 2.多重继承super可以保公共父类仅被执行一次 一.首先看下普通继承的写法 二.再看看super继承的写法 参考链接:http://blog.csdn.net/lqhbupt/article/details/19631991

python3:lambda,map,filter内置函数

notes: 参考文档-(菜鸟教程)http://www.runoob.com/python/python-built-in-functions.html 参考文档-(妖白)http://blog.csdn.net/qq_24753293/article/details/78337818 一.lambda() 描述: 简化def函数 实例: A=lambda x:x+1 理解为: def A(x): return x+1 冒号左边→想要传递的参数 冒号右边→想要得到的数(可能带表达式) 二.ma

【转】关于python中带下划线的变量和函数 的意义

http://www.blogjava.net/lincode/archive/2011/02/02/343859.html 总结: 变量: 1.  前带_的变量:  标明是一个私有变量, 只用于标明, 外部类还是可以访问到这个变量 2.  前带两个_ ,后带两个_ 的变量:  标明是内置变量, 3.  大写加下划线的变量:  标明是 不会发生改变的全局变量 函数: 1. 前带_的变量: 标明是一个私有函数, 只用于标明, 2.  前带两个_ ,后带两个_ 的函数:  标明是特殊函数 Pytho

python中带有下划线的变量和函数

一.变量 常量:大写加下划线 USER_CONSTANT 对于不会发生改变的全局变量,使用大写加下划线. 私有变量:小写和一个前导下划线 _private_value python中不存在私有变量一说,若是遇到需要保护的变量,使用小写和一个前导下划线.但这只是程序员之间的一个约定,用于警告说明这是一个私有变量,外部类不要去访问它.但实际上,外部类还是可以访问到这个变量. 内置变量:小写,两个前导下划线和两个后置下划线 __class__ 两个前导下划线会导致变量在解释期间被更名.这是为了避免内置

python中的map,filter,zip函数

map() Return an iterator that applies function to every item of iterable, yielding the results 例如: a = map(lambda x:x**2 ,[1,2,3]) print([b for b in a]) 结果: [1, 4, 9] 或者: a = map(lambda x,y:x+y ,[1,2,3],[1,2]) print([b for b in a]) 结果: [2, 4] filter(

Python中特殊函数和表达式 filter,map,reduce,lambda

1. filter 官方解释:filter(function or None, sequence) -> list, tuple, or string Return those items of sequence for which function(item) is true. If function is None, return the items that are true. If sequence is a tuple or string, return the same type,

python中的enumerate()函数的用法

enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中,可以接手一到两个参数.ex:seq=['one','three','four']循环列表时:普通循环:为 for i in seq:print(i)效果为:onethreefour可以看到只是输出列表元素,不带下标的.加入count计数器时:count=0for i in seq:print(count,i)count+=1效果为:0 one1 t

python中的enumerate()函数用法

enumerate函数用于遍历序列中的元素以及它们的下标,可以非常方便的遍历元素. 比如我在往excel中写数据时就用到了这个函数: data = [] data.append(('预约码', '车牌号码', '进校时间段', '出校时间段', '进校校区',)) for i in car_orders: data.append((i.order_number, i.car_number, i.during_in_time, i.during_out_time, i.in_school)) fo

python中的enumerate函数用于遍历序列中的元素以及它们的下标

enumerate 函数用于遍历序列中的元素以及它们的下标: >>> for i,j in enumerate(('a','b','c')): print i,j 0 a1 b2 c>>> for i,j in enumerate([1,2,3]): print i,j 0 11 22 3>>> for i,j in enumerate({'a':1,'b':2}):    #注意字典,只返回KEY值!! print i,j 0 a1 b >&g