在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”技能:)
答案 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)