繁体   English   中英

Python:将List Comprehension转换为lambda函数?

[英]python: converting List Comprehension to lambda function?

我在下面有一个列表,并且当“ prop”等于给定的字符串时,我尝试使用一个lambda函数从列表中检索“ cat”值。

a=[{'prop':'ABC','cat':'ABC Dir'}, {'prop':'DEF','cat':'DEF Dir'}, ...]

我已经成功地获得了一个列表理解功能,如果我输入“ ABC”,可以得到预期的“ ABC Dir”,但是如果可能的话,我无法将其转换为lambda函数。 建议表示赞赏。

>>> aa=[x['cat'] for x in a if x['prop'] == 'ABC']
>>> aa
['ABC Dir']

预期结果:

>>>bb('ABC')
'ABC Dir'
>>>bb('DEF')
'DEF Dir'

如果您想编写一个执行列表理解的函数,它将接受原始列表以及要测试的值作为参数,并返回列表理解的结果,如下所示:

def getcats(a, value):
    return [x['cat'] for x in a if x['prop'] == value]

由于它返回单个表达式的结果,因此很容易转换为匿名函数(lambda)。

lambda a, value: [x['cat'] for x in a if x['prop'] == value]

如果只需要第一个值,则可以将next()与生成器表达式一起使用。 这样,它在找到第一个值时停止。

lambda a, value: next(x['cat'] for x in a if x['prop'] == value)

当然,可能没有任何匹配的值。 在这种情况下,您可以添加next()的可选第二个参数以在该实例中返回None

lambda a, value: next((x['cat'] for x in a if x['prop'] == value), None)

使用列表推导(然而,kindall提出的生成器是最Python的方式):

a=[{'prop':'ABC','cat':'ABC Dir'}, {'prop':'DEF','cat':'DEF Dir'}]

bb = lambda prop: ' '.join([val['cat'] for val in a if val['prop'] == prop])

bb('ABC')

将为您提供所有匹配项的字符串:

'ABC Dir'

这是另一种将匹配项与空格连接起来的方法,如果您也想传递数组:

f = lambda prop, d: ' '.join([val['cat'] for val in d if val['prop'] == prop])

f('ABC',a)

返回值:

'ABC Dir'

我将接受它,因为您不太了解python中的术语。 Lambda是python中的关键字。 如果要定义功能,只需说定义一个功能即可。 实际上,您根本不需要使用lambda来定义命名函数。

以下代码应满足您的要求:

def bb(x):
    for i in a:
        if i['prop'] == x:
            return i['cat']
    else:
        return None

在样式指南PEP8中,您不应使用lambda定义命名函数: https ://www.python.org/dev/peps/pep-0008/

始终使用def语句代替将lambda表达式直接绑定到标识符的赋值语句。

是:

def f(x):返回2 * x

没有:

f =λx:2 * x

您可能必须结合使用filtermap才能实现真正的功能性方法。

a = [{'prop':'ABC','cat':'ABC Dir'}, {'prop':'DEF','cat':'DEF Dir'}]

def bifilter(LoD, prop):
    return map(lambda x: x['cat'], filter(lambda d: d['prop'] == prop, LoD))

list(bifilter(a, 'ABC'))  # ['ABC Dir']

我的建议是去理解列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM