【问题标题】:Python Iterating over lists in lists with map()Python 使用 map() 遍历列表中的列表
【发布时间】:2018-05-22 16:52:45
【问题描述】:

所以我的意图是使用 map、filter 和 lambda 迭代列表中的列表 例如:

[ [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 之后移动过滤器,但是这似乎也不起作用。我很感激任何提示或帮助。

【问题讨论】:

    标签: python lambda filter


    【解决方案1】:

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

    固定版本是:

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

    (即使它产生了预期的结果,仍然不是很清楚......我花了 3 或 4 次尝试通过反复试验来让它正确,而 filtermap 需要迭代的事实在 Python 3 中并没有帮助并扼杀了关于那些时尚关键字的全部炒作)

    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/map/filter 学习/尝试更多。这就是为什么我选择以这种方式尝试。再次感谢您的所有帮助。
    【解决方案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)
    

    【讨论】:

    • 谢谢,这对我理解一切有很大帮助。
    【解决方案3】:
    lst = list(map(lambda k: list(filter(lambda l: l != 0, k)), lst))
    

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

    【讨论】:

      【解决方案4】:

      这是一种可能性:

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

      【讨论】:

        【解决方案5】:

        另一种解决方案可能是:

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

        【讨论】:

        • 小心! remove 只删除第一次出现的元素。
        • 是的,你说得对,我做了一些改变来避免这个问题!
        猜你喜欢
        • 2011-05-24
        • 1970-01-01
        • 2016-08-27
        • 2011-09-14
        • 2022-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多