首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >javascript在python中的_.where

javascript在python中的_.where
EN

Stack Overflow用户
提问于 2015-11-17 02:10:49
回答 3查看 63关注 0票数 1

http://underscorejs.org/,有一家名为underscorejs的实用程序where

代码语言:javascript
运行
复制
_.where(listOfPlays, {author: "Shakespeare", year: 1611}

它回来了,

代码语言:javascript
运行
复制
[{title: "Cymbeline", author: "Shakespeare", year: 1611},
 {title: "The Tempest", author: "Shakespeare", year: 1611}]

如果不使用for in迭代,我如何在python中做到这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-17 02:21:54

就我个人而言,我想使用清单理解。然而,它确实涉及到forin

代码语言:javascript
运行
复制
>>> listOfPlays = [{'title': x, 'author': x, 'year': 1611} for x in ('Shakespeare', 'someone')]
>>> listOfPlays
[{'author': 'Shakespeare', 'year': 1611, 'title': 'Shakespeare'}, {'author': 'someone', 'year': 1611, 'title': 'someone'}]
>>> 
>>> [x for x in listOfPlays if x['author'] == 'Shakespeare' and x['year'] == 1611]
[{'author': 'Shakespeare', 'year': 1611, 'title': 'Shakespeare'}]

或者,您可以使用filter

代码语言:javascript
运行
复制
>>> filter(lambda x: x['author'] == 'Shakespeare' and x['year'] == 1611, listOfPlays)
[{'author': 'Shakespeare', 'year': 1611, 'title': 'Shakespeare'}]

编辑:请注意,上面的示例是在Python2中计算的。在Python3中,内置函数filter返回一个可迭代函数,而不是一个列表。

票数 2
EN

Stack Overflow用户

发布于 2015-11-17 02:29:21

请注意,filter(function, iterable)等同于[item for item in iterable if function(item)]

代码语言:javascript
运行
复制
def filter_by_dict(list_of_dicts, conditions):
    def _check(item):
        # returns True only if first is subset of second
        # in python3 you should use items()
        return conditions.viewitems() <= item.viewitems()

    return filter(_check, list_of_dicts)

TEST = [
    {"title": "Cymbeline", "author": "Shakespeare", "year": 1611},
    {"title": "Otherr", "author": "Shakespeare", "year": 1612},
    {"title": "The Tempest", "author": "Shakespeare", "year": 1611}
]
print(filter_by_dict(TEST, {"author": "Shakespeare", "year": 1611}))
票数 1
EN

Stack Overflow用户

发布于 2015-11-17 03:48:45

作为列表理解,相当于_.where的代码可以在1行中用python编写,但它将使用for ... in语法:

代码语言:javascript
运行
复制
def where(elems, **kwargs):
    """where(iterable, **filter_conditions) --> filtered iterable"""
    return [el for el in elems if all(el.get(k) == v for k, v in kwargs.items())]

或者,使用filter &map来避免使用for ... in

代码语言:javascript
运行
复制
def where(elems, **kwargs):
    """where(iterable, **filter_conditions) --> filter object"""
    def picker(elem): 
        return all(map(lambda x: elem.get(x[0]) == x[1], kwargs.items()))
    return filter(picker, elems)

在python 2中,两个版本的where函数都被调用为:

代码语言:javascript
运行
复制
where(listOfPlays, author='Shakespeare', year=1611)

在python 3上,后一个版本需要包装在一个列表中,因为filter返回一个过滤器对象,即

代码语言:javascript
运行
复制
list(where(listOfPlays, author='Shakespeare', year=1611))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33747992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档