Python使用map()迭代列表中的列表

时间:2017-12-08 12:27:31

标签: python lambda filter

所以我的目的是使用map,filter和lambda遍历列表中的列表 e.g:

  [[33,3,3,0],[34,1,0,4]]应该产生[[33,3,3],[34,1,4]]

   def no_zeros(lst):
      a=map(filter(lambda x:(y==0 for y in x) ,lst),lst)
      print (list(a))
      #(says that filter is not callable)

我知道这段代码不起作用,但我不知道我到底做错了什么,因为我仍然是lambda等新手。我已经尝试了不同的东西,比如在lambda之后移动过滤器,但是这似乎也没有用。我感激任何种类或帮助。

5 个答案:

答案 0 :(得分:8)

map将第一个参数中的函数应用于第二个参数。它会尝试调用您的filter对象...

固定版本为:

list(map(lambda z: list(filter(None,z)),lst))

(即使它产生了预期的结果,仍然不是很清楚......我试了三次或四次尝试通过试验和错误,以及filter& {{1}需要在Python 3中进行迭代并没有帮助并杀死关于那些时髦关键词的整个炒作)

map复杂度的这一点上,您最好使用列表理解:

lambda/map/filter

结果:

lst = [ [33,3,3,0] , [34,1,0,4] ]

result = [ [x for x in sl if x] for sl in lst]

print(result)

答案 1 :(得分:2)

问题是map期望函数/可调用作为第一个参数,但是你给它一个filter的结果。

您可以将filter应用于由map迭代的子列表来解决此问题:

def no_zeros(lst):
    a = map(lambda x: filter(lambda y: y != 0, x), lst)
    print(list(a))

顺便说一句,你可以用列表推导做同样的事情:

def no_zeros(lst):
    a = [[y for y in x if y != 0] for x in lst]
    print(a)

答案 2 :(得分:1)

@ViewChild('selectorContainer') selectorContainer: ElementRef;
ngAfterViewInit() {
    this.selectorContainer.nativeElement.querySelector('svg') // <-- my SVG DOM element

}

这应该可以解决问题。您需要通过过滤器在列表中的每个元素上应用lambda。请注意嵌套的lambdas很难看。

答案 3 :(得分:1)

这是一种可能性:

import itertools
a = [ [33,3,3,0] , [34,1,0,4] ] 
list(map(list, map(filter, itertools.repeat(bool), a)))
# [[33, 3, 3], [34, 1, 4]]

答案 4 :(得分:1)

另一种解决方案可能是:

def no_zeros(lst):
   if isinstance(lst, list):
      for i in lst:
          while 0 in i:
              i.remove(0)
      print(lst)
   else:
      raise TypeError("lst must be type of list")