2014-04-20 1 views
1

를 사용하여 :파이썬 : 독립적으로 각 행을 처리 목록 가정지도 기능

[[2,4,0,8],[0,2,4,8],[8,0,2,4],[8,2,0,4]] 

안녕 얘들 아 내가 어떻게 목록의 행 내부의 각 요소를 처리하는지도 기능을 사용합니까?

예 : 나는 각 목록의 쌍을 추가하려면 :

[[6,0,8,0],[2,0,12,0],[8,0,6,0],[10,0,4,0]] 

을 기본적으로 나는 매핑에 대한 매우 유용한 기사를 찾을 수 없을, 아주 잘지도 기능을 사용하는 방법을 모르겠어요. 내가 링크를 얻을 수 있다면 고맙겠습니다. 감사!!!

+0

"각 목록의 쌍을 추가하고 싶습니다."- 정확히 무엇을 의미합니까? 예를 들어 줄 수 있습니까? 어떻게 페어를 만들 수 있습니까? –

+0

실제로 중요한 것은 행의 요소를 조작하는 방법을 알고 싶습니다. 그렇다면 예를 들어에 대한 모든 요소를 ​​추가 할 수도 있습니다. [2,4,0,8] 그것을 [14,0,0,0]으로 만듭니다. – Shawn

+0

업데이트 된 답변 읽기. –

답변

3

실제로는 기능에 따라 다릅니다. 먼저

: 기능 f 다음 각 요소를 수용 경우 map()을 중첩 호출해야합니다

m = [[6, 0, 8, 0], [2, 0, 12, 0], [8, 0, 6, 0], [10, 0, 4, 0]] 
map(f, m) 

둘째 : 기능이 f 말을하면 "목록은 완전한 행"당신은 사용할 수 있습니다 받아 아래처럼 :

map(lambda r: map(f, r), m) 

이렇게하려면 목록 압축 :을 사용할 수도 있습니다. 당신이 functools.partial 확인이 example을 사용할 수 있습니다처럼3210

[map(f, r) for r in m] # I prefer this 

는 다른 트릭이있다. 응답으로

from functools import partial 
newf = partial(map, f) 
map(newf, m) 

편집는 언급합니다 :

사실 중요한 것은 내가 행의 요소를 조작하는 방법을 알고 싶은 것입니다. 그렇다면 예를 들어에 대한 모든 요소를 ​​추가 할 수도 있습니다. [2, 4, 0, 8][14, 0, 0, 0]으로 만듭니다.

첫째, 당신은 단지 14 — 합 왜 안 출력, [14, 0, 0, 0]에 목록 [2, 4, 0, 8] 변환 당신이 당신의 프로그램의 알고리즘/디자인을 개선 할 수 있는지 확인하고 싶어 의심하는 이유가 있습니다.

어쨌든, 파이썬에서 우리는 합() 함수를 가지고, 문서 sum(iterable[, start]), 예 (의견을 읽고) 읽기 : 당신이 m 같은 "목록의 목록을"통과하고 싶은 경우에 따라서

>>> row = [2,4,0,8] 
>>> sum(row) # just outputs sum of all elements, in rows 
14 

을 (당신은에 게시

>>> m = [[6, 0, 8, 0], [2, 0, 12, 0], [8, 0, 6, 0], [10, 0, 4, 0]] 
>>> map(sum, m) # call sum for each row (a list) in `m` 
[14, 14, 14, 14] # sum of all individual list's elements 

을하지만 당신은 목록을 만들기를 원하는 경우 다음 질문처럼 당신이 다음과 같이 합 + (목록 합칠) 연산자를 사용할 수 있습니다 :

0 질문) 당신은 map(sum, m)은 아래 참조 사용할 수 있습니다
>>> row = [2, 4, 0, 8] 
>>> [sum(row)] + [0,] * (len(row) -1) 
[14, 0, 0, 0] 
>>> 
이 코드 조각을 이해하려면

  1. [sum(row)]이 행 — [14]의 합 단일 요소의 목록을 의미한다.
  2. [0,] * (len(row) -1)은 행의 원소 개수 후 길이 하나 이하의 제로의 목록을 만들고, 코드 예 이하 확인 :

    >>> row = [2, 4, 0, 8] # 4 elements 
    >>> [0,] * (len(row) -1) 
    [0, 0, 0] # 3 zeros 
    >>> 
    

    * 표시 연산자 마찬가지로 또한 튜플 문자열을 적용 할 수있다.

    위에서 그래서
  3. , 나는 두 개의 별도의 목록을 확인하고 + 모두 최종적으로 아래와 같이 추가 : 이제

    >>> row = [2, 4, 0, 8] 
    >>> [sum(row)] + [0,] * (len(row) -1) 
    [14, 0, 0, 0] # that is what you wants 
    

를, 각 행 i에 ∈m, 다음을 [sum(row)] + [0,] * (len(row) -1) 표현을 실행하고 싶어 당신은 다음과 map()와 람다 식을 사용할 수 있습니다 더 나은

>>> map(lambda row: [sum(row)] + [0,] * (len(row) -1), m) 
[[14, 0, 0, 0], [14, 0, 0, 0], [14, 0, 0, 0], [14, 0, 0, 0]] 

이 lambd하는 것입니다 식이 이름 :

>>> f = lambda r: [sum(r)] + [0,] * (len(r) -1) 
>>> f(row) 
[14, 0, 0, 0] 

다음 map()를 사용

>>> map(f, m) 
[[14, 0, 0, 0], [14, 0, 0, 0], [14, 0, 0, 0], [14, 0, 0, 0]] 

내가 내 대답에 처음 몇 줄에 제시된 것처럼. 이것은 깨끗한 해결책 아니다

>>> [f(r) for r in m] 
+0

빠른 검색에서이 [ "python 맵 및 기타 기능 도구 사용 방법"]을 찾을 수있었습니다. (http://stackoverflow.com/questions/672172/how-to-use-python-map-and-other-functional - 툴) –

+0

고마워요, 정말 고마워요! – Shawn

+1

@ user3498996 환영합니다. 파이썬을 향상시키고 자한다면 (리소스가 필요하다는 이유로) 매일 핫리스트에서 [4-5 Q & A] (http://stackoverflow.com/tags/python/hot)를 읽어 보시기 바랍니다.) 정기적으로 [높은 투표 응답] (http://stackoverflow.com/questions/tagged/python?sort=votes&pageSize=50). 가장 좋은 책은 파이썬을 배우는 것입니다.하지만 시간이 걸립니다. –

1

, 그러나 당신이 어떻게 목록리스트에 map를 사용하는 방법을 보여줍니다 : 다시 당신은)지도 (호출하는 대신에 여기리스트 압축을 사용할 수 있습니다.

그러나 addPairs 메서드를 정의하려면 list을 입력으로 받아야하며 list을 반환해야합니다.

lst = [[2,4,0,8],[0,2,4,8],[8,0,2,4],[8,2,0,4]] 

def addPairs(y): 
    out = [] 
    for i in xrange(len(y)): 
     if i % 2 == 0: 
     out.append(y[i] + y[i+1]) 
     else: out.append(0) 
    return out 


output = map(addPairs, lst) 
print output 
1

서브 어레이는 4 개 항목에 고정되는 경우, 입력 된 배열의 각 항목 [a, b, c, d] 들어, 출력 map을 사용하여 항목 [a+b, 0, c+d, 0]

을 원이 사용을 할 수있다

map(lambda x: [x[0]+x[1], 0, x[2]+x[3], 0], input_array) 
+0

매우 제한적으로 보입니다. 각 목록에 1000 개의 요소가 있다면 어떨까요? – sshashank124

+0

@ sshashank124 그렇다면 다른 방법을 사용하십시오. 이것은 주로 하나의 간단한 값을 다른 값으로 매핑하여지도의 작동 방식을 보여주는 매우 간단한 예를 의미합니다. –

+0

내 질문에 대답을 삭제하는 이유 –

0

나는 this 게시물을보고 시작할 것입니다. 가장 좋은 대답은 아주 좋은 정보입니다. 나는 또한 내가뿐만 아니라 람다를 사용하는 경향이지도를 사용합니까 때마다 때문에 람다 함수에 [이] 페이지를 볼 것

... 당신이 게시 된 예를 들어 같은

...

I 이를 위해 매핑을 사용하지 않을 것입니다. 목록 작성을 사용하는 것이 좋습니다.

v=[[sum(i[0:2]),0,sum(i[2:]),0] for i in m]