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

Python使用map()在列表中的列表上迭代,python,lambda,filter,Python,Lambda,Filter,所以我的目的是用map、filter和lambda在列表中迭代列表 e、 g: [[33,3,3,0],[34,1,0,4]]应导致[[33,3,3],[34,1,4]] 我知道这个代码不起作用,但我不知道我到底做错了什么,因为我对lambda还是有点陌生,等等。我已经尝试了不同的方法,比如在lambda之后移动过滤器,但这似乎也不起作用。非常感谢您的帮助。map将第一个参数中的函数应用于第二个参数。它试图调用您的过滤器对象 固定版本为: list(map(lambda z: list(filt

所以我的目的是用map、filter和lambda在列表中迭代列表 e、 g:

[[33,3,3,0],[34,1,0,4]]应导致[[33,3,3],[34,1,4]]


我知道这个代码不起作用,但我不知道我到底做错了什么,因为我对lambda还是有点陌生,等等。我已经尝试了不同的方法,比如在lambda之后移动过滤器,但这似乎也不起作用。非常感谢您的帮助。

map
将第一个参数中的函数应用于第二个参数。它试图调用您的
过滤器
对象

固定版本为:

list(map(lambda z: list(filter(None,z)),lst))
(即使它产生了预期的结果,仍然不是很清楚……我花了3到4次尝试通过尝试和错误将其正确,而在Python3中,
filter
&
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)
结果:

[[33, 3, 3], [34, 1, 4]]

这应该能奏效。您需要通过过滤器对列表中的每个元素应用lambda。请注意嵌套lambda很难看。

这里有一种可能性:

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]]

问题是,
map
需要一个函数/可调用函数作为第一个参数,但您要给它一个
过滤器的结果

您可以通过将
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)

另一个解决方案可能是:

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")

谢谢,这实际上帮助了我对一切的理解。小心<代码>删除
只删除元素的第一次出现。是的,你说得对,我做了一些更改以避免此问题!谢谢,我确实认为其他方法,比如列表理解可能是更好的主意,但是我想用lambda/map/filter学习/尝试更多。这就是为什么我选择这样做。再次感谢你的帮助。
def no_zeros(lst):
    a = [[y for y in x if y != 0] for x in lst]
    print(a)
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")