Bem*_*mmu 34 python functional-programming
我今天开始阅读关于underscore.js的文章,它是一个javascript库,它添加了一些我习惯在Python中使用的函数式编程好东西.一个非常酷的速记方法是采摘.
确实在Python中我经常需要挖掘一些特定的属性,并最终做到这一点:
users = [{
"name" : "Bemmu",
"uid" : "297200003"
},
{
"name" : "Zuck",
"uid" : "4"
}]
uids = map(lambda x:x["uid"], users)
Run Code Online (Sandbox Code Playgroud)
如果下划线速记在Python中的某处,那么这是可能的:
uids = pluck(users, "uid")
Run Code Online (Sandbox Code Playgroud)
添加它当然是微不足道的,但是在Python的某个地方已经存在了吗?
Kat*_*iel 41
只需在消耗的函数中使用列表推导uids
:
代替
uids = map(operator.itemgetter("uid"), users)
foo(uids)
Run Code Online (Sandbox Code Playgroud)
做
foo([x["uid"] for x in users])
Run Code Online (Sandbox Code Playgroud)
如果你只是想uids
迭代,你不需要列表 - 改为使用生成器.(替换[]
为()
.)
例如:
def print_all(it):
""" Trivial function."""
for i in it:
print i
print_all(x["uid"] for x in users)
Run Code Online (Sandbox Code Playgroud)
Cha*_*nor 14
从funcy模块(https://github.com/Suor/funcy),你可以挑选采摘功能.
在这种情况下,如果您的主机上有funcy,则以下代码应按预期工作:
from funcy import pluck
users = [{
"name" : "Bemmu",
"uid" : "297200003"
},
{
"name" : "Zuck",
"uid" : "4"
}]
uids = pluck("uid", users)
Run Code Online (Sandbox Code Playgroud)
请注意参数的顺序与underscore.js使用的顺序不同