2017-12-16 13 views
2

map 함수를 double for 루프로 사용할 수 있도록하기 위해 map 함수를 두 번 적용하려고 생각했지만 이해가되는지 모르겠습니다. 그 방법이 궁금하십니까? 기능에파이썬에서 함수형 프로그래밍에서 중첩 for 루프를 구현하는 방법은 무엇입니까?

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) 

그 다음 내가 접근 할 루프에 대해 하나라면

예를 들어

이 내가 일하고 무엇인가 그것은 내가 위에서 한 것처럼. 그래서 이중지도를 구현하려고했지만 구조화 방법을 모르겠습니다. 도움이 될 것입니다.

+0

두 개 이상의 루프가있는 것보다 훨씬 많은 작업을 수행 할 수 있습니다. 또한 내부 루프에 합계를 생성 할 수도 있습니다. –

+0

'map (sum, A)'과 같은 효과를 얻을 수 있습니다. 그런데 아무 것도 중첩 할 필요가 없습니다. –

+0

'map()'에서 여러분의 시도는 당신의 맥락에서 의미가 없습니다; 아마도'reduce()'를 생각하고 있을까요? 'map()'은 여러개의 iterable을 하나의 입력으로 받아들이지 만,'map (..., A)'는 오직 ** 하나의 ** 입력만을 가지고 있으므로 람다를위한 * 하나의 인수 만 갖습니다. 그런 다음 합계가 아닌 일련의 결과를 작성합니다. 'reduce()'는 함수와 입력 시퀀스를 반복적으로 호출하여 단일 결과를 생성합니다. –

답변

3

당신은 그래서 그냥 A 각 중첩 된 목록에 sum을 적용, 내부리스트 A를 합산됩니다

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

당신은 또한 당신이 필요 여부에 따라 지능형리스트 또는 발전기 식을 (사용을 고려할 수 (파이썬 2 목록을 생성에서, 파이썬 3가 느리게 작동 map())을 유유히 결과를 생산 :

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) 

당신은 그렇지 않으면 생성 할 수 ij이고 직교 곱이고, 사용하는 문자는 itertools.product()이고; 이 대신 itertools.starmap()를 사용하여 해결 될 수

from itertools import product 

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

: 그러나, 당신이 호출지도에 정수의 튜플 전달 될 것

from itertools import product, starmap 

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

어느 것이 합을 생산; 나는 가장 깊은 값의 제곱을 대신 생성하는 lambda을 시연 했으므로 행 사이를 구별하지 않고 제곱 된 모든 값의 긴 시퀀스 하나를 얻습니다. 매핑이 작동하는 방식으로 입력 당에서 처리되는 항목 당 값 이 생성됩니다.

네스트map()을 호출 할 수도 있습니다. 외부 map()의 호출에 내부 map()을 넣어 :

map(lambda r: map(lambda v: v ** 2, r), A) 

하지만 그때가있는 한, 합산은,이 시나리오에서 이해가되지 않습니다 다시 파이썬 3에서 게으른 개체의 게으른 순서를 생산하고 있습니다 결과가 누적되지 않습니다.

의 결과는 시퀀스 전체에서 functools.reduce() function을 사용하려고합니다. callable은 실행 결과와 시퀀스의 다음 값에 대해 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>) 단지 자세한 느린 방법입니다.

+0

그래서 이중 루프로 구성된 매트릭스 인 A [i] [j] 부분을 어떻게 처리 할 수 ​​있을지 궁금합니다. – ce1

+0

은 둘 다 동일한 방법입니까? – ce1

+0

@ ce1 : 두 가지 방법 모두? 아니요, product() 메소드는 같은 결과를 생성하지 않습니다. 바깥 쪽 루프의 반복마다'd '를 리셋 할 때'product()'와 같은 결과를 생성 할 수 없다. –