Python将嵌套循环转换为简单的循环

时间:2012-11-09 11:14:45

标签: python python-2.7

在Python 2.7.x中我有两个列表我想要一个返回第一个值(不是索引)的函数,如下所示

def first_incorrect_term(polynomial, terms):
    for index in range(len(polynomial), len(terms)):
        if evaluate(polynomial, index) != terms[index-1]:
            return evaluate(polynomial, index)

让我们假设评估是一个有效的功能。我想将这三个看起来像面向对象的行替换为在Python中使用“find”或某些此类函数的东西。

基本上我正在迭代第二个列表的索引超出多项式中的数字项(因为我相信第一个X项将匹配),评估它并与预期的术语进行比较。对于术语不匹配的第一个实例,我希望返回评估的多项式。

我正在寻找使用Python find / lambda或者其他类似东西来替换这3行,这是因为我可以肯定地看到我没有使用如link中所述的Python功能/ p>

PS:这与项目Euler问题有些相关,但是我已经使用上面的代码解决了它,并希望提高我的“Python”技能:)

2 个答案:

答案 0 :(得分:1)

首先,使用yield制作函数的生成器版本:

def incorrect_terms(polynomial, terms):
    for index in range(len(polynomial), len(terms)):
        eval = evaluate(polynomial,index)
        if eval != terms[index-1]:
            yield (polynomial, index, eval)

然后第一个结果是第一个不匹配:

mismatches = incorrect_terms(polynomial, terms)
first_mismatch = mismatches.next()

我认为你实际上想迭代所有术语的值,而不是多项式长度之后的值,在这种情况下你可以压缩:

results = (evaluate(polynomial,index) for index in count(0))
pairsToCompare = itertools.izip(results, terms)
mismatches = (pair for pair in pairsToCompare if pair[0] != pair[1])

first_mismatch = mismatches.next()

假设evaluate(polynomial, n)正在计算给定多项式的第n项,并且这些项与terms中的值进行比较。

答案 1 :(得分:0)

我会使用生成器表达式来完成它,但它们也不适合一行:

def first_incorrect_term(polynomial, terms):
    evaled = ((index, evaluate(polynomial, index)) for index in range(len(polynomial), len(terms)))
    return next((val for index, val in evaled if val != terms[index-1]), None)