假设我有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)
最狡猾的方式是什么?如果可能的话,我想在不导入外部模块的情况下这样做。
编辑:我检查了其他解决方案。 “重复”答案需要导入模块;我试图没有。此外,我正在尝试执行一个返回输出而不是打印值的操作,这使得zip的使用超出了重复答案中显示的级别。
答案 0 :(得分:0)
从列表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,正如这个答案的评论中所建议的那样:
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
的匿名替换。