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

时间:2018-03-04 05:22:55

标签: python if-statement

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

考虑以下搜索字词列表:

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来自nanpd.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调用。它正在运行,我想我现在就明白了。

2 个答案:

答案 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