1

在 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)

让我们假设 evaluate 是一个有效的函数。我想将这三行看起来面向对象的内容替换为在 Python 中使用“查找”或某些此类函数的内容。

基本上,我正在遍历第二个列表的索引,而不是多项式中的数字项(因为我相信前 X 项将匹配),对其进行评估并与预期项进行比较。对于条款不匹配的第一个实例,我希望返回评估的多项式。

我正在寻找使用 Python find/lambda 或类似的东西来替换这 3 行,这是因为我绝对可以看到我没有使用链接中描述的 Python 功能

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

4

2 回答 2

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

于 2012-11-09T11:34:30.473 回答
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)
于 2012-11-09T11:34:17.510 回答