【python进阶】常用效率函数和容器妙用(Map,Filter,defaultdict…)

热门标签

GentleCP

发表文章数:52

首页 » 技术杂谈 » Python » 正文

前言

在编写代码的过程中我们经常遇到对许多相同元素做重复操作的问题,通常情况下都会采用编写for循环解决。这种方式一方面效率低下,另一方面代码不美观,python提供了许多高效的工具来轻松实现这些操作,这部分本文主要讲解Map,Filter,Reduce三者的使用。同时,python提供了许多有效率的容器能够解决一些日常比较麻烦处理的问题。

Map

Map与C语言中的Map不是一个东西,它允许将一个函数操作映射到输入列表中的所有元素上。常用格式如下:

map(func,list)   # 注意传入的func是函数的地址,不是func()这种形式

比如我们要对一个列表l=[1,2,3,4]中所有元素翻倍:

  • 基本方法
    for i,e in enumerate(l):
        l[i] = e*2  
    # >> l:[2,4,6,8]

    上面的写法比较简洁,笨重一点可能会是用一个新列表不断append 翻倍之后的元素。

  • map方法
    def double(x):
        return x*2
    l = list(map(double,l))
    # >> l:[2,4,6,8]

    还可以采用lambda匿名函数实现

    l = list(map(lambda x:x*2,l))
    # >> l:[2,4,6,8]

上面是同一个函数对多个元素的操作,当然我们也可以用逆向思维,将函数地址作为列表元素。如下:

def double(x):
    return x*2
def add1(x):
    return x+1
funcs = [double,add1]
a = 5
print(list(map(lambda x:x(a),funcs)))  # 对a分别做double和add1操作,将两个操作结果打印出来
# >> [10, 6]

在上面匿名函数中的x就是具体的函数了,x(a)即对应double(a),add1(a)

Filter

Filter顾名思义,就是一个过滤器,通过输入一列表元素,将指定元素过滤出来。
比如我们要对一个列表l=[-1,-7,4,3]中元素大于0的筛选出来:

print(list(filter(lambda x:x>0,l)))
# >> [3,4]

同样匿名函数的部分可以改成自己设计的过滤函数(例如过滤质数,过滤姓“王”的人)

Reduce

前两个工具可能听过、用过的较多,Reduce用来实现对列表中所有元素一起做运算。
比如我们要将一个列表l=[1,2,3,4]中所有元素累加起来。

from functools import reduce
print(reduce(lambda x,y:x+y, l))
# >> 10

当然累加只是一个列子,用sum函数也能做到这一点

defaultdict

这是属于模块collections的一个数据类型,它拥有与dict同样的功能,同时弥补了dict的不足。
比如我经常性使用dict会遇到的一个问题,就是对于不存在键值的访问。如下:
一共两个人(cp,pc)的数据,他们的分数由多个元组的形式存储在一个列表中,现在要将属于同一个人的分数按照字典存储,代码如下

grades = [('cp',7),('pc',8),('cp',5),('pc',10)]  

d = {}
for grade in grades:
    try:
        d[grade[0]].append(grade[1])
    except KeyError:
        d[grade[0]] = [grade[1]]
# >> {'cp': [7, 5], 'pc': [8, 10]}

由于dict本身不会检查键是否存在,如果我们对一个不存在的key进行了操作,就会报KeyError的错误。上面的代码是一般的处理方法,也可以通过if,else的方式检验key是否存在。

如果用defaultdict就完全不会出现这类问题:

from collections import defaultdict

grades = [('cp',7),('pc',8),('cp',5),('pc',10)] 

d = defaultdict(list)  # 指定数据类型为list
for grade in grades:
    d[grade[0]].append(grade[1])
# >> defaultdict(list, {'cp': [7, 5], 'pc': [8, 10]})
标签:

未经本人允许不得转载!作者:GentleCP, 转载或复制请以 超链接形式 并注明出处 求索
原文地址:《【python进阶】常用效率函数和容器妙用(Map,Filter,defaultdict…)》 发布于2020-08-30

分享到:
赞(0)

评论 抢沙发

评论前必须登录!

  注册



Vieu4.5主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册