如何在python函数编程中实现嵌套for循环?

时间:2017-12-16 21:29:48

标签: python loops functional-programming

我正在考虑将map函数应用两次,以便让它充当双循环,但我不知道这是否有意义。 这是怎么回事?

例如,这就是我正在做的事情:

当务之急:

def degree(A):
    n = len(A)
    t = []
    for i in range(n):
        d = 0
        for j in range(n):
            d+=A[i][j]
        t.append(d)

    return t

功能性:

def degree(A):
    n = len(A)
    t = []
    map(lambda x,y:x+y,A)

如果它是一个单循环,那么我会像上面那样接近它。所以我试图实现双重映射,但我不知道如何构建它。 任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:3)

您正在对内部列表A求和,因此只需将sum应用于A中的每个嵌套列表:

def degree(A):
    return map(sum, A)

您还可以考虑使用列表推导或生成器表达式(取决于您是否需要延迟生成结果(在Python 2中map()生成一个列表,在Python 3中它可以懒惰地工作):

def degree(A):
    # returns a list
    return [sum(row) for row in A]

def degree(A):
    # returns a generator
    return (sum(row) for row in A)

您可以使用itertools.product()生成ij作为笛卡儿产品;但是,你将整数的元组传递给可调用的地图:

from itertools import product

map(lambda ij: A[ij[0]][ij[1]] ** 2, product(range(len(A)), 2))

可以使用itertools.starmap()代替:

from itertools import product, starmap

starmap(lambda i, j: A[i][i] ** 2, product(range(len(A)), 2))

两者都没有产生;我演示了一个lambda来生成最内层值的平方,所以你得到一个长序列的所有值,平方,没有区别行。这就是映射的工作原理,它会在输入中为每个项目生成一个值

你也可以嵌套 map()个电话;将内部map()放在外部map()

的callable中
map(lambda r: map(lambda v: v ** 2, r), A)

但请注意,这会在Python 3中生成一系列懒惰对象。同样,求和在这种情况下没有意义,因为没有结果累积。

对于序列中结果的通用累积,您希望使用functools.reduce() function; callable对运行结果和序列中的下一个值应用可调用对象。您可以使用lambda x, y: x + y函数和map()

生成总和
map(lambda r: reduce(lambda x, y: x + y, r, 0), A)

但是对于只是求和reduce(lambda x, y: x + y, <iterable>, 0)语法只是一种冗长而缓慢的拼写方式sum(<iterable>)