如何迭代地将 2 个列表中的元素应用到新函数中? [复制]

Posted

技术标签:

【中文标题】如何迭代地将 2 个列表中的元素应用到新函数中? [复制]【英文标题】:How can i iteratively apply elements from the 2 lists into a new function? [duplicate] 【发布时间】:2017-01-09 08:43:44 【问题描述】:

假设我有 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的方法是什么?如果可能的话,我想这样做而不导入外部模块。

编辑:我检查了其他解决方案。 “重复”答案需要导入模块;我试图不这样做。此外,我正在尝试执行返回输出而不是打印值的操作,这使 zip 的使用复杂化,超出了重复答案中显示的级别。

【问题讨论】:

您在寻找for a, b in zip(ListA, ListB):吗?另外,请注意,您发布的不是 Python - 大小写很重要。 @jonrsharpe 哪一部分不是python(哪一部分取决于大小写)?请原谅我的无知,我还是个初学者。 Def -> def, For -> for。如果您是新手,请阅读教程。这是重复的,zip 不需要导入,您可以使用 ab 做任何您想做的事情。 啊,我的粗心错误。我在手机上打字。我现在将对其进行编辑。 至于复制,“原版”需要导入itertools。它还打印并且不对压缩元素执行操作。 【参考方案1】:

从列表 A 和 B 中获取第 i 个元素,其中 (a,b) 是 A 和 B 的第 i 个元素

如果 len(A) == len(B),则希望输出 = sum(a * var ** b) 用于 len(A) 中的索引

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

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,正如 cmets 中针对此答案所建议的那样:

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 的匿名替换。

【讨论】:

这是一个不同于我正在寻找的公式,但我应该能够将相同的原理应用于我的。谢谢!编辑:公式已更正,就像一个魅力。 @mikey 有点困,误读了公式。我编辑的帖子中的公式是否正确? 是的,没错。 我能问一下downvote是为了什么吗? 我赞成您的回答,因为代码有效。一定是别人。

以上是关于如何迭代地将 2 个列表中的元素应用到新函数中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

python把列表前几个元素提取到新列表

如何将列表中的元素组合到新的嵌套列表中?

如何使 jQuery 函数迭代从同一类中的 2 个列表中获取的单独数组?

元素为零时如何避免列表迭代

将函数应用于两列并将输出映射到新列[重复]

如何比较字典值中的多个数组,并将每个数组元素的字典键映射到新数组/列表中