【问题标题】:filter using lambda function and zip使用 lambda 函数和 zip 过滤
【发布时间】:2020-05-20 00:25:48
【问题描述】:

我正在尝试检查列表是否为空,使用带有 lambda 函数和 zip 的过滤器返回相关描述。

它的工作,但结果不符合预期。

list_of_lists = [ [ ] , [ 'not_empty' ] ]
list_of_desc = [ 'first_list_is_empty' , 'second_list_not_empty' ]

result = list(filter(lambda item : item[1] if not item[0] else '',zip(list_of_lists,list_of_desc )))

result
Out[180]: [([], 'first_list_is_empty')]

不明白为什么它返回元组,我在切片元组时期待“first_list_is_empty”。

【问题讨论】:

  • help(filter) -> “返回一个迭代器,产生那些函数(项目)为真的可迭代项目。”您的 lambda 为迭代器的第一个元素返回 True,以便从过滤器返回该元素。
  • 感谢@mechanical_meat

标签: python lambda filter zip


【解决方案1】:

这是因为 filter() 不会修改返回的内容,它只使用 lambda 来确定它是否“应该”返回元组。说清楚:

func = lambda item : item[1] if not item[0] else ''
func = lambda item : bool(item[1] if not item[0] else '')

是完全相同的过滤功能。

要修改返回的内容,请改用内置的 map() 函数。另请注意, filter() 默认自动删除 False 事物,您不需要 lambda。

func   = lambda item : item[1] if not item[0] else ''
result = list(filter(None,map(func,zip(list_of_lists,list_of_desc))))

【讨论】:

  • 谢谢,它可以工作@Bobby Ocean。试图让我明白,因为 None is not callable() 它如何在过滤器中作为可调用函数工作。我使用 bool 更明确。 list (filter ( bool , map( lambda item: item [ 1 ] if not item[ 0 ] else ' ',zip (list_of_lists,list_of_desc))))
  • 嗯,None 只是意味着选择默认值,它实际上并不使用 None 本身。如果传递一个 None,则默认为函数“lambda item : bool(item)”。是的,输入“bool”是等价的。我只放了 None 因为这就是帮助所说的,运行“过滤器?”在 ipython 会话中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多