【问题标题】:How can i iteratively apply elements from the 2 lists into a new function? [duplicate]如何迭代地将 2 个列表中的元素应用到新函数中? [复制]
【发布时间】: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。它还打印并且不对压缩元素执行操作。

标签: python list iteration user-defined-functions


【解决方案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是为了什么吗?
  • 我赞成您的回答,因为代码有效。一定是别人。
猜你喜欢
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多