不知哪儿看到一个说法,大概是当map的函数参数可以直接引用一个已有的函数变量时(比如内建函数int,str之类的),用map更优美些,否则还是用列表解析更直观和快速.

我同意此说法.

昨天在写一个函数时,最开始用的是map:

def process_messages(arr,msgs,mode):
return map(lambda msg:process_message(arr,msg,mode),msgs)

可以看到,那个lambda显得笨拙而庞大.今天起来转念一想,用列表解析不是更好么:

def process_messages(arr,msgs,mode):
return [process_message(arr,msg,mode) for msg in msgs]

前段时间没事的时候用Python模拟map函数时发现,map函数的功能就是列表解析的子集..当时没有用到zip函数,版本是这样:

def imap(func,*seqs):
return (func(*(seq[i] for seq in seqs)) for i in range(len(seqs[0])))

今天突然发现zip函数原来是可以接受多个序列的,于是有了更优美的版本:

def imap(func,*seqs):
return [func(*args) for args in zip(*seqs)]

从上面的imap可以看到,列表解析完全可以涵盖map的功能.当然,一些由于程序构造需要传递函数变量的情况,可能只能使用map.但这种的话总是可以改的.

而且,对于两个或两个以上的序列情况,map函数更繁杂:

map(lambda arg1,arg2,...,argn:func(arg1,arg2,...,argn),seq1,seq2,...,seqn)

[func(*args) for args in zip(seq1,seq2,...,seqn)]

filer也有这样的倾向:

def clean_message(s):
return ''.join(filter(lambda c:c.isalpha(),s.upper())) def clean_message(s):
return ''.join(c for c in s.upper() if c.isalpha())

当然,以下这类情况用map,filter还是非常优美的:

string=''
map(int,string) numseqs=[(1,1,1,0),(1,1,1,1)]
filter(all,numseqs)

附,强大而灵活的zip函数和for循环.

>>> for k,v in [(1,2),(2,4)]:
print k,v 1 2
2 4
>>> for k,v,x in [(1,2,3),(2,4,5)]:
print k,v,x 1 2 3
2 4 5
>>> for k in [(1,2,3),(2,4,5)]:
print k (1, 2, 3)
(2, 4, 5)
>>>

python 列表解析与map和filter函数的更多相关文章

  1. python利用or在列表解析中调用多个函数.py

    python利用or在列表解析中调用多个函数.py """ python利用or在列表解析中调用多个函数.py 2016年3月15日 05:08:42 codegay & ...

  2. Python列表解析与生成器表达式

    Python列表解析 l = ["egg%s" %i for i in range(100) if i > 50] print(l) l= [1,2,3,4] s = 'he ...

  3. python列表解析补充:

    python列表解析补充: # 补充: f = [x + y for x in 'ABCDE' for y in '1234567'] print(f) test = [] for x in 'ABC ...

  4. python 列表解析

    列表解析,主要用于动态创建列表 本篇主要说一下,lambda.map().和filter()同列表解析语句之间结合的用法 列表解析的基本语法为:[expr for iter_var in iterab ...

  5. 如何实现JavaScript的Map和Filter函数?

    译者按: 鲁迅曾经说过,学习JavaScript最好方式莫过于敲代码了! 原文: Master Map & Filter, Javascript’s Most Powerful Array F ...

  6. python列表解析和生成器表达式

    列表解析作为动态创建列表的强大工具,值得学习. 列表解析技术之前的状况--函数式编程. lambda.filter(), map() enumerate, sorted, any, all, zip ...

  7. Python函数式编程:内置filter函数使用说明

    filter操作是函数式编程中对集合的重要操作之一,其作用是从原集合中筛选符合条件的条目,组成一个新的集合. 这在我们日常编程中是非常常见的操作.我们通常的做法是通过循环语句来处理. 而使用filte ...

  8. 【392】Python 列表解析

    参考: Python3 数据结构 | 菜鸟教程 列表推导式 列表推导式提供了从序列创建列表的简单途径.通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的 ...

  9. Python 列表解析list comprehension和生成表达式generator expression

    如果想通过操作和处理一个序列(或其他的可迭代对象)来创建一个新的列表时可以使用列表解析(List comprehensions)和生成表达式(generator expression) (1)list ...

随机推荐

  1. HTTP响应状态解析

    100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应.服务器必须在请求完成后向客 ...

  2. clique

    [题目描述]数轴上有 n 个点,第 i 个点的坐标为 xi,权值为 wi.两个点 i,j 之间存在一条边当且仅当 abs(xi-xj)>=wi+wj.你需要求出这张图的最大团的点数.(团就是两两 ...

  3. USACO 2017 February Gold

    那天打cf前无聊练手 T1.Why Did the Cow Cross the Road 题目大意:N*N的矩阵,从左上角走到右下角,走一步消耗T,每走3步消耗当前所在位置上的权值,求最小消耗 思路: ...

  4. 51Nod 1326 遥远的旅途

    题目描述: 一个国家有N个城市,这些城市被标为0,1,2,...N-1.这些城市间连有M条道路,每条道路连接两个不同的城市,且道路都是双向的.一个小鹿喜欢在城市间沿着道路自由的穿梭,初始时小鹿在城市0 ...

  5. 使用EasyNetQ组件操作RabbitMQ消息队列服务

    RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...

  6. DS4700电池更换步骤

    DS4700电池更换步骤: 在A控制器里操作(带电热插拔控制器)对逻辑盘进行切换: (需要先将A控下挂的硬盘手工切换到B控上.然后对A控进行电池更换,更换完成后再将原A控下挂硬盘切回) 如下详细步骤: ...

  7. Thread类中的静态方法

    1.currentThread() currentThread()方法返回的是对当前正在执行线程对象的引用. package thread; /** * 线程类的构造方法.静态块是被main线程调用的 ...

  8. WEB中间件--Jboss未授权访问,

    1,Jboss未授权访问部署木马 发现存在Jboss默认页面,点进控制页 点击 Jboss.deployment 进入应用部署页面 也可以直接输入此URL进入 http://www.ctfswiki. ...

  9. Eclipse 一直不停 building workspace完美解决总结

    一.产生这个问题的原因多种1.自动升级 2.未正确关闭  3.maven下载lib挂起 等.. 二.解决总结(1).解决方法        方法1.修改eclipse启动文件 eclipse.ini ...

  10. RabbitMQ日志无法禁用问题

    最近使用spring+rabbitmq发现其Debug日志非常多,几天就把服务器磁盘弄爆了. 原来rabbitmq依赖logback.xml输出日志. 在和log4j.properties同目录下加一 ...