我如何将 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
的匿名替换。
假设我有 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
的匿名替换。