使用过滤器替换 Python 中的搜索功能



致Python爱好者和专家,

我的代码:

def getAssignee(keyTitle):
assignee = ''
for item in assigneeList:
if(item['title']==keyTitle):
assignee = item['name']
break
return assignee

我的意图:在python中尝试过滤器,并将上面的代码替换为过滤器函数。任务分配对象列表是字典的列表。 例如

assigneeList = [{'title':'Book', 'name':'Davis'},{'title':'TV','name':'Samsung'}]

我的参考:在字典列表中搜索的最有效方法

我的尝试:

assignee = filter(lambda item: item['title']=='TV',assigneeList)
print(assignee['name'])

我的输出:不工作。错误"值'受让人'不可下标">

的问题:如何获取受让人名称,就像我如何从getAssignee()函数中获取一样?

filter

的结果是一个过滤器对象,您可以通过多种方式处理它,并处理空过滤器的可能性

  • 使用next(.., None)获取第一个匹配值或None

    def getAssignee(keyTitle):
    assignee = next(filter(lambda item: item['title'] == keyTitle, assigneeList), None)
    return assignee['name'] if assignee else ''
    
  • 收集列表中的项目,然后绘制第一个

    def getAssignee(keyTitle):
    assignee = list(filter(lambda item: item['title'] == keyTitle, assigneeList))
    return assignee[0]['name'] if assignee else ''
    

next解决方案如果性能更高,因为它不会生成所有过滤器对象,(list将消耗所有过滤器,最终它可能很大)

>>> assignee = filter(lambda item: item['title']=='TV',assigneeList)
>>> type(assignee)
<class 'filter'>

在python 3中filter函数将返回过滤器对象。filter(function, iterable)等效于生成器表达式(item for item in iterable if function(item))。所以为了评估项目,你可以打电话list(assignee)

最新更新