我如何将 2 个列表中的元素迭代应用到新函数中?

How can i iteratively apply elements from the 2 lists into a new function?

假设我有 2 个列表,第一个列表的第 i 个元素对应于第二个列表的第 i 个元素。我如何将 2 个列表中的元素迭代应用到不同的函数中?

def GetLists(n):
    List1 = []
    List2 = []
    n = int(input("how many terms: "))
    for i in range(1,n):
        val1 = float(input("what is val1: "))
        val2 = float(input("what is the corresponding val2: "))
        List1.append(val1)
        List2.append(val2)
    return List1, List2

def newfunc(ListA, ListB, var):
    # take i-th elements from lists A and B where (a,b) are the i-th elements of A and B
    # want output = sum(a * var ** b) for index in len(A) if len(A) == len(B)

最符合 pythonic 的方法是什么?如果可能的话,我想在不导入外部模块的情况下这样做。

编辑:我检查了其他解决方案。 "duplicate" 答案需要导入模块;我试着没有。另外,我正在尝试执行 returns 输出而不是打印值的操作,这使得 zip 的使用变得复杂,超出了重复答案中显示的级别。

take i-th elements from lists A and B where (a,b) are the i-th elements of A and B

want output = sum(a * var ** b) for index in len(A) if len(A) == len(B)

这是您要找的吗?它将两个相同长度的列表压缩在一起,计算 f(a, b, i) = a[i] * var ** b[i] 一些常量 var 和每个 i 其中 0 <= i < len(a)。然后returns总和。

def process(list_a, list_b, var):
    if len(list_a) != len(list_b):
        raise ValueError('Lists are not equal in length')

    def combine():
        for a, b in zip(list_a, list_b):
            yield a * var ** b

    return sum(combine())

print(process([5, 2, 3], [2, 2, 3], 10))

输出

3300

此输出是 (1 * 10 ** 2) + (2 * 10 ** 2) + (3 * 10 ** 3) 的结果。

编辑

上述方法将组合逻辑(这是您问题的重点)与求和逻辑分离。一种可以说更 Pythonic(根据您的要求)并且更短的替代方法是使用 generator expression,如该答案的评论中所建议的:

def process(list_a, list_b, var):
    if len(list_a) != len(list_b):
        raise ValueError('Lists are not equal in length')
    
    return sum(a * var ** b for a, b in zip(list_a, list_b))

print(process([1, 2, 3], [2, 2, 3], 10))

本质上,sum 中的表达式充当我在先前方法中定义的 生成器函数 combine 的匿名替换。