我今天开始阅读有关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的某个地方了吗?
答案 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
的顺序不同