使用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'
然后通过传递listl
调用该方法,如soaskOracle(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'
然后通过传递listl
调用该方法,如soaskOracle(l)
旧答案(在修订问题之前,评论中澄清了未使用词典的事实):
首先,我想指出的是,在python中字典是不按顺序排列的(在python 3.6之前,正如@johnashu所指出的),因此不能按顺序遍历字典中的键和值,否则这可能是一个很好的解决方案
对于下面的答案,我假设当你说nan和notFound时,你的意思是字典包含字符串“nan”和“notFound”。如果您正在寻找“是否”术语