如何在多个列表上迭代一个函数?

时间:2019-05-29 15:10:17

标签: python

我具有以下功能:

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

理想情况下,我希望将其向量化并避免使用循环,但是任何输入或方向都非常感谢!

4 个答案:

答案 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}]