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

使用python有条件地按顺序迭代搜索词的最佳方法,python,if-statement,Python,If Statement,更新:问题已经修改,可以在大型代码示例前后阅读更多信息 考虑以下搜索词列表: searchterms={'term1':地址,'term2':名称,'term3':'coordinates'} 其中,all可以是'nan'(DataFrame中的np.nan)或包含一些有效的搜索词 假设我有一个函数: def askGoogle(术语): #返回查询结果或跳到下一步 如果术语是nan或服务器返回NotFound,我将如何以最佳和最有效的方式从术语1开始-尝试下一个,直到其中一个返回结果或全

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


考虑以下搜索词列表:

searchterms={'term1':地址,'term2':名称,'term3':'coordinates'}
其中,all可以是'nan'(DataFrame中的np.nan)或包含一些有效的搜索词

假设我有一个函数:

def askGoogle(术语):
#返回查询结果或跳到下一步
如果术语是
nan
或服务器返回
NotFound
,我将如何以最佳和最有效的方式从术语1开始-尝试下一个,直到其中一个返回结果或全部是
nan
NotFound

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

我是python新手,但是有没有一些简单的方法可以做到这一点?也许是递归函数

注意:我尝试在这里和谷歌搜索,但我真的不知道要搜索什么

EDIT
nan
来自
pd.DataFrame
np.nan
),如果搜索词没有给出任何信息,则从服务器返回
NotFound
(实际上是
“ZERO\u RETURNS”
)。上面并没有正确地说出来,但必须按顺序对条款进行试验

EDIT2:以下是我开始使用的代码(为了可读性而清理):

它显然不起作用,我在完成它之前就崩溃了


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

如果术语=askGoogle(术语)!='零结果':
回报期
但是,这是在使用python。 相反,在的帮助下,我得到了以下代码:

将numpy导入为np
def askGoogle(自身、类型、术语):
查询=“”
对于术语:
如果类型==1:
self.setParams(self.queryParams(术语))
self.setCallType('textsearch')
elif类型==2:
self.setParams(self.detailsParams(术语))
self.setCallType('placeid'))
如果是术语!=np.nan:
query=json.load(requests.get(url=self.url,params=self.params))
如果查询['status']=“确定”:
打破
返回查询
然后我可以使用以下方法调用:

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

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

您只需使用for循环在字典上迭代即可:

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

print(askOracle(searchterms))

这将返回它到达的第一个搜索词。。如果没有,它将返回
None

,您可以使用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'
然后通过传递list
l
调用该方法,如so
askOracle(l)

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

首先,我想指出的是,在python中字典是不按顺序排列的(在python 3.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'

如果只需要检查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'
然后通过传递list
l
调用该方法,如so
askOracle(l)

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

首先,我想指出的是,在python中字典是不按顺序排列的(在python 3.6之前,正如@johnashu所指出的),因此不能按顺序遍历字典中的键和值,否则这可能是一个很好的解决方案

对于下面的答案,我假设当你说nan和notFound时,你的意思是字典包含字符串“nan”和“notFound”。如果您正在寻找“是否”术语