更新:问题已经修改,可以在大型代码示例之前和之后阅读更多信息。
考虑以下搜索字词列表:
searchterms = {'term1': address, 'term2': name, 'term3': 'coordinates'}
其中all可以是'nan'(在DataFrame中为np.nan)或包含一些有效的搜索词。
并说我有一个功能:
def askGoogle(term):
# return query result or skip to next
如果术语为nan
或服务器返回NotFound
,我将以最佳和最有效的方式开始使用term1 - 尝试下一个,直到一个返回结果或全部为{{1 }或nan
。
到目前为止,我已经结束了一个巨大的ifif else恐怖块(我会省去你的麻烦,它的深度是7级)。
我是python的新手,但是不是有一些简短的方法吗?也许是一些递归函数?
注意:我试图在这里和谷歌搜索,但我真的不知道要搜索什么。
编辑:NotFound
来自nan
(pd.DataFrame
)和np.nan
(实际上,它是NotFound
)如果搜索词没有给出任何内容,则从服务器返回。它没有在上面正确出现,但必须按顺序审查这些条款。
EDIT2 :这是我用开始的代码(为了便于阅读而清理):
"ZERO_RETURNS"
它显然无法正常工作,我在最终确定之前就崩溃了。
更新:我最初想要的是,我没有注意到,是一种直接在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
但是,这是not possible使用python。 相反,在@alexbhandari的帮助下,我最终得到了以下代码:
if term = askGoogle(term) != 'ZERO_RESULTS':
return term
然后我可以使用:
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
注意:编号用于区分不同类型的API调用。它正在运行,我想我现在就明白了。
答案 0 :(得分:2)
如果你只需要检查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'
另请注意,对于第一项,这将至少运行一次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中排序的(在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'
答案 1 :(得分:0)
您可以使用for循环遍历字典:
def askOracle(dict):
for v in dict.values():
if v:
return v
print(askOracle(searchterms))
这将返回它到达的第一个搜索词。如果不是,它将返回None