[英]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
您可能必须结合使用filter
和map
才能实现真正的功能性方法。
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.