map 和filter都是对一个列表进行操作,它依次取出列表中元素,然后将其传给map/filter的第一个参数(那是一个函数),最后返回一个列表 两者的不同是 map 是取这个函数的返回值,然后追加到map函数的返回值列表中 filter 则是根据这个函数返回值是True或是False,将 这个列表中的元素 追加到filter函数的返回值列表 >>> map(lambda x: x.startswith('visual'),['visual basic','visual c++','java','python']) [True, True, False, False] >>> filter(lambda x: x.startswith('visual'),['visual basic','visual c++','java','python']) ['visual basic', 'visual c++']
关于map/filter 存在着从下个版本去除的趋势,因为其不直观,替代的就是list comprehensions filter 的 listcomprehensions写法
>>> [item for item in ['visual basic','visual c++','java','python'] if item.startswith('visual')] ['visual basic', 'visual c++'] map的listcomprehensions写法,就是要把原来函数的表示式提前 >>> [item.startswith('visual') for item in ['visual basic','visual c++','java','python']] [True, True, False, False] 但list comprehensions 的功能还不仅于此,它可以迭代多个列表,进行多个判断
如取出一个列表中的那些元素同时存在于另外两个列表 a=[3,6,7] b=[7,9,10,6] c=[6,5,3] [item for item in a if item in b if item in c] 下面是一段实际的代码,binding对象有个对其它对象的一个方法引用(getter),如果这个引用存在,则执行这个方法(getter()获取值),刚开始用python时通常会这样写 def _collect(self): record={} for binding in self.bindings: if binding.getter: record[binding.property_name]=binding.getter() return record 但实际上可以写成 def _collect(self): return dict([(binding.property_name,binding.getter()) for binding in self.bindings if binding.getter])
深入 通常,列表是常见的可迭代对象,但tuple或是dict都是(默认对dict迭代其keys(),你可以可以显式的使用keys(),values()或是items()函数),由于filter的语义,它会返回被迭代对象的实际类型如 >>> filter(lambda x: x%2==0,(2,3,4,5)) (2, 4) >>> 接下去,试着用()来代替list comprehensions的[],会得到什么? >>> a= (x for x in [1,2,3] if x%2==0) >>> a.next() 2 >>> type(a) <type 'generator'> >>> 因为a 是个generator ,所以可以用如下内置函数,如 sum(x for x in [1,2,3]) # 6 max(x for x in [1,2,3]) # 3 min(x for x in [1,2,3]) # 1 可用的还有all,any 版本2.5 enumerator 版本2.3 返回enumerate 对象,可以用for in 处理 list 转换为list set 转换为set sorted 排序 zip 返回一个tuple的list 参考: list comprehensions http://www.python.org/dev/peps/pep-0202/ 注: 这里列表指可迭代的对象,通常是list对象 |