首页 > 解决方案 > 如何编写 Inline/Lambda 以追加或不追加到列表

问题描述

我觉得这是一个菜鸟问题,但我没有太多使用 lambda 函数,而且我在网上找不到我需要的东西。我想编写一个 lambda 函数,它将一个系列作为输入,并返回一个没有任何“None”的列表基本上我想要一个用于 followinf 函数的 lambda 函数:

def get_path(x):
  toRet = []
  for item in x.tolist():
    if item is not None:
      toret.append(item)
  return toRet

是否有可能获得一个内联 lambda 函数来执行 get_path() 所做的事情。是的,我知道我可以执行以下操作:

lambda x: get_path(x)

它解决了这个问题,但我真的很想知道如何为此创建一个内联函数。

标签: pythonpython-3.x

解决方案


正如其他人指出的那样,您可以使用filter()但要注意为过滤检查提供的功能。

如果functionNone,则假定恒等函数,即所有iterable为 false 的元素都被删除。

list(filter(None, something))将无法正常工作,因为它也会过滤掉 False-ish 值,而不仅仅是None. 例子:

>>> mylist = [1, 2, 3, 0, None, '', tuple(), 'last']
>>> list(filter(None, mylist))  # not the expected behaviour
[1, 2, 3, 'last']

OP 有一个明确的if item is not None检查,而不仅仅是if item- 所以两者是不等价的。只None需要过滤掉。要获得正确的过滤行为,请对提供给过滤器的函数进行实际检查:

>>> list(filter(lambda i: i is not None, mylist))
[1, 2, 3, 0, '', (), 'last']

替换mylistx.tolist()。当你把它放到一个 lambda 中时,它会变得一团糟:

get_path = lambda x: list(filter(lambda i: i is not None, x.tolist()))

而不是所有这些,列表理解选项更好:

get_path = lambda x: [i for i in x.tolist() if i is not None]

有明确的is not None检查。


推荐阅读