采用Python

时间:2012-03-22 04:41:53

标签: python functional-programming

我今天开始阅读有关underscore.js的内容,它是一个javascript库,它添加了一些我习惯在Python中使用的函数式编程好东西。一个很酷的速记方法是pluck

确实在Python中我经常需要提取一些特定属性,并最终做到这一点:

users = [{
    "name" : "Bemmu",
    "uid" : "297200003"
},
{
    "name" : "Zuck",
    "uid" : "4"
}]
uids = map(lambda x:x["uid"], users)

如果下划线速记在Python的某个地方,那么这是可能的:

uids = pluck(users, "uid")

添加它当然是微不足道的,但已经在Python的某个地方了吗?

2 个答案:

答案 0 :(得分:39)

只需在消耗uids的任何函数中使用列表推导:

而不是

uids = map(operator.itemgetter("uid"), users)
foo(uids)

DO

foo([x["uid"] for x in users])

如果您只想让uids进行迭代,则无需创建列表 - 请改用生成器。 (将[]替换为()。)


例如:

def print_all(it):
    """ Trivial function."""
    for i in it:
        print i

print_all(x["uid"] for x in users)

答案 1 :(得分: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)

请注意参数的顺序与underscore.js

的顺序不同