采用Python

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)

  • 可以使用`x.get('uid',None)`(其中`None`是默认值)以避免在项目没有uid时引发异常. (3认同)

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使用的顺序不同