我具有以下功能:
def calc(X: float, Y: float, z: float) -> dict:
n1 = X*Y
n2 = Y*z
n3 = z**2
return {"c": n1, "d" : n2, "e" : n3}
我可以使用[10,10,20]之类的列表,并使用* args方法将其输入到函数中:
list_1 = [10,10,20]
calc(*list_1)
#results
{'c' : 100, 'd': 200, 'e': 400}
但是,假设我要将一个数组或多个列表传递给该函数,例如:
list_2 = [[10,10,20],
[20,25,30],
[35,40,45]]
我希望函数在每个单独的列表上进行迭代。
我已经考虑过使用循环,但是无法获取如何遍历多维列表的各个方面。
我尝试通过执行以下操作来潜在地使用索引:
for x in len(list_2):
call(*list_2[x])
但出现以下错误:
'int' object is not ierable
理想情况下,我希望将其向量化并避免使用循环,但是任何输入或方向都非常感谢!
答案 0 :(得分:3)
请注意,您不可避免地要遍历列表,因为您必须提取每个子列表并将其作为参数传递给函数。
现在,您可以遍历2D列表,并将每个子列表作为参数传递,然后将结果收集在列表中
def calc(X: float, Y: float, z: float) -> dict:
n1 = X*Y
n2 = Y*z
n3 = z**2
return {"c": n1, "d" : n2, "e" : n3}
list_2 = [[10,10,20],
[20,25,30],
[35,40,45]]
#Iterate over the sublists, pass each sublist to the function, and collect its result
res = [calc(*li) for li in list_2]
print(res)
或者您可以使用map,它等效于上面定义的列表理解
#Pass each sublist to the function by unpacking the list of lists, and collect its result
res = list(map(calc, *list_2))
两种情况下的输出将相同
[{'c': 100, 'd': 200, 'e': 400},
{'c': 500, 'd': 750, 'e': 900},
{'c': 1400, 'd': 1800, 'e': 2025}]
答案 1 :(得分:2)
您可以使用itertools.starmap:
using FileVersionRepo;
<script src="global.js?ver=@FileVersionRepo.GetVal("global.js")"><script>
答案 2 :(得分:2)
您还可以将unpacked list_2
传递到map()
函数中。
代码:
def calc(x: float, y: float, z: float) -> dict:
n1 = x*y
n2 = y*z
n3 = z**2
return {"c": n1, "d": n2, "e": n3}
list_2 = [[10, 10, 20], [20, 25, 30], [35, 40, 45]]
result = list(map(calc, *list_2))
输出:
[{'c': 200, 'd': 700, 'e': 1225}, {'c': 250, 'd': 1000, 'e': 1600}, {'c': 600, 'd': 1350, 'e': 2025}]
答案 3 :(得分:1)
您可以使用map
函数(https://docs.python.org/3.5/library/functions.html#map),因此可以执行以下操作:
print(list(map(calc, *list_2)))
,输出将是:
[{'c': 200, 'd': 700, 'e': 1225}, {'c': 250, 'd': 1000, 'e': 1600}, {'c': 600, 'd
': 1350, 'e': 2025}]