使用python有条件地按顺序迭代搜索项的最佳方法

2024-10-01 02:35:12 发布

您现在位置:Python中文网/ 问答频道 /正文

更新:问题已经修改,可以在大型代码示例前后阅读更多信息。你知道吗


考虑以下搜索词列表:

searchterms = {'term1': address, 'term2': name, 'term3': 'coordinates'}

所有人都可以是“南”(np.nan公司或者包含一些有效的搜索项。你知道吗

假设我有一个函数:

def askGoogle(term):
    # return query result or skip to next

如果term1是nan或server返回NotFound,那么如何以最佳和最有效的方式从term1开始-尝试下一个,直到一个返回结果或全部返回nanNotFound。你知道吗

到目前为止,我已经结束了一个巨大的如果elif else块的恐怖(我会节省你的麻烦,它是7级深)。你知道吗

我对python还不熟悉,但这不是有一些简单的方法吗?也许是递归函数?你知道吗

注意:我试着搜索这里和谷歌,但我真的不知道要搜索什么。你知道吗

编辑nan来自pd.DataFramenp.nan)并且NotFound(实际上,它是"ZERO_RETURNS",如果搜索项没有给出任何信息,则从服务器返回。上面说得不对,但必须按顺序审理这些条款。你知道吗

EDIT2:以下是我用开始的代码(为可读性而清理): 你知道吗

query = ''
    if not term1 == 'nan' or not term2  == 'nan' or not term3 == 'nan' :
        if not term1 == 'nan':
            if not term2 == 'nan':
                if not term3 == 'nan': # All found.
                    query = askGoogle(term1, self.queryParams(term1))
                        if query['status'] == 'NotFound':
                            query = askGoogle(term)
                                if query['status'] == 'NotFound':
                                    query = askGoogle(term)
                                else:
                                    query = askGoogle(term)
                            else:
                                query = askGoogle(term)
                    else: # Only term2 and term1 found.
                        query = askGoogle(term)
                            if query['status'] == 'NotFound':
                                query = askGoogle(term)
                                if query['status'] == 'NotFound':
                                    query = askGoogle(term)
                                else:
                                    query = askGoogle(term)                     
                else:
                    if not term3 == 'nan': #  Only term1 and term3 found.
                        query = askGoogle(term)
                        if term2
                        query = askGoogle(term)
                    else: # Only term1
                        term1 = askGoogle(term)
            elif not term2 == 'nan': # Only term2 and term3 found.
                if not term3 == 'nan':
                    term2 = askGoogle(term)
                    if not term2:
                    term3 = askGoogle(term)
                else: # Only term2 found
                    term2 = askGoogle(term)
            elif not term3 == 'nan': # term3 found
                term3 = askGoogle(term)
        else:
            query = 'All terms this loop is exhausted, nothing found'

它显然不工作,我只是崩溃之前,我可以完成它。你知道吗


更新:我最初寻找的是一种直接在if中设置变量的方法,我没有注意到:

if term = askGoogle(term) != 'ZERO_RESULTS':
    return term

但是,这是使用python的not possible。 相反,在@alexbhandari的帮助下,我得到了以下代码:

import numpy as np

def askGoogle(self, type, terms):
    query = ''
    for term in terms:
        if type == 1: 
            self.setParams(self.queryParams(term))
            self.setCallType('textsearch')
        elif type == 2: 
            self.setParams(self.detailsParams(term))
            self.setCallType('placeid')
        if term != np.nan:
            query = json.loads(requests.get(url=self.url, params=self.params))
            if query['status'] == 'OK':
                break
    return query

我可以使用以下方法调用:

resp = askGoogle(x, [term1, term2, term3])

注意:编号是为了区分不同类型的API调用。它在运行,我想我现在就知道了。你知道吗


Tags: term1selfonlyifstatusnotnanquery
2条回答

您只需使用for循环遍历字典:

def askOracle(dict):
    for v in dict.values():
        if v:
            return v

print(askOracle(searchterms))

这将返回它到达的第一个搜索项。。否则它将返回None

如果你只需要检查3个变量,我会使用If,else If块。结果很快。请注意,这假设您的askGoogle(term1,self.queryParams参数(term1))我从你的问题中得到了正确的答案,你已经把numpy作为np导入了。你知道吗

def askOracle(term1, term2, term3):
    if term1 != np.nan and askGoogle(term1, self.queryParams(term1)) != 'NotFound':
        return term1
    elif term1 != np.nan and askGoogle(term1, self.queryParams(term1)) != 'NotFound':
        return term2
    elif term1 != np.nan and askGoogle(term1, self.queryParams(term1)) != 'NotFound':
        return term3
    else:
        return 'Nothing found'

还要注意的是,这将为术语1至少运行一次askGoogle()。要解决这个问题,您必须将if语句拆分为所有三个术语的两个if。你知道吗

if term1 != np.nan:
    return term1
elif askGoogle(term1, self.queryParams(term1)) != 'NotFound':
    return term1

如果你能把term1,term2,term3放在一个列表中,我们就可以循环遍历这个列表,这样代码就短了一点。把所有的东西拼凑起来,我想到了这个。以下内容也已更新,以返回查询结果,而不是term1,因为此要求已添加到注释中。你知道吗

l = [term1, term2, term3]

def askOracle(l):
    for term in l:
        if term != np.nan:
            return askGoogle(term, self.queryParams(term))
        query = askGoogle(term, self.queryParams(term))
        if query != 'NotFound':
            return query
    return 'Nothing found'

然后通过像这样传递列表l来调用方法askOracle(l)

旧答案(在问题修改之前,注释中澄清了未使用词典的事实):

首先,我想指出的是,在python中字典没有排序(在python3.6之前,正如@johnashu所指出的那样),因此不能按顺序遍历字典中的键和值,否则这可能是一个很好的解决方案。你知道吗

对于下面的答案,我假设当你说nan和notFound时,你的意思是字典包含字符串nan和notFound。如果您正在查找“term1”实际上是字典中的一个键还是完全丢失,可以在访问字典时用try,catch块替换If语句。你知道吗

def askOracle(searchterms):
    for i in range(1,4):
        value = searchterms['term%d'%i]
        if(value != 'nan' and value != 'NotFound'):
            return value
    return 'All elements nan or NotFound'

相关问题 更多 >