在http://underscorejs.org/,有一家名为underscorejs的实用程序where,
_.where(listOfPlays, {author: "Shakespeare", year: 1611}它回来了,
[{title: "Cymbeline", author: "Shakespeare", year: 1611},
{title: "The Tempest", author: "Shakespeare", year: 1611}]如果不使用for in迭代,我如何在python中做到这一点?
发布于 2015-11-17 02:21:54
就我个人而言,我想使用清单理解。然而,它确实涉及到for和in
>>> 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
>>> filter(lambda x: x['author'] == 'Shakespeare' and x['year'] == 1611, listOfPlays)
[{'author': 'Shakespeare', 'year': 1611, 'title': 'Shakespeare'}]编辑:请注意,上面的示例是在Python2中计算的。在Python3中,内置函数filter返回一个可迭代函数,而不是一个列表。
发布于 2015-11-17 02:29:21
请注意,filter(function, iterable)等同于[item for item in iterable if function(item)]
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}))发布于 2015-11-17 03:48:45
作为列表理解,相当于_.where的代码可以在1行中用python编写,但它将使用for ... in语法:
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
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函数都被调用为:
where(listOfPlays, author='Shakespeare', year=1611)在python 3上,后一个版本需要包装在一个列表中,因为filter返回一个过滤器对象,即
list(where(listOfPlays, author='Shakespeare', year=1611))https://stackoverflow.com/questions/33747992
复制相似问题