2014-12-02 1 views
0

목록 내의 모든 개체에 대해 몇 가지 작업을 수행하고 처리 된 목록의 구조와 정확히 일치하는 새 목록을 출력하는 재귀 함수를 작성하려고합니다. 여기에 사용자로부터 도움을 받았지만, 필자는 필자가 문자열을 반복적으로 시도하고 map()을 사용하여 잘 작동하도록 시도했다. 나는 반복 가능하지 않은 INT와 같은 다른 데이터 유형에 적용하고 그러나 때, 나는 오류 얻을 : 나는 그들이 반복 가능하지 않기 때문에 여기에 예로서 정수를 사용하고 내가 기대하고map() 이외의 목록 구조가 파이썬에서

def process_list(_list): 
new_list = [] 
for x in _list: 
    if is_list(x): 
     new_list.append(process_list(x)) 
    else: 
     new_list.append(map(lambda y: y + 1, x)) 
return new_list 

def is_list(l): 
return type(l) == types.ListType 

_list = [[0,1,2],[0,1,2],[0,1,2]],[0,1,2]] 

을 그지도() 정수 목록에서 실패합니다. 반복 가능하지 않은 다른 데이터 유형을 상상해보십시오. 이것을 정의 할 수있는 또 다른 방법이있어 목록 내의 객체에 대해 일부 기능을 수행 한 다음 입력 목록과 일치하는 출력 목록을 만들 수 있습니까?

는 항목에 간단한 추가를 수행함으로써

답변

1

을 당신은 ITE하려고 : 당신은 당신이 사용하는 것이 문자열에지도를 호출하고 싶었 isinstance(x, basestring) 당신이 모두를 확인하는 것은 당신이 달성하려고에 따라 달라집니다 (map() 함수를 사용하여) x을 초과하지 않는 경우가 대부분이며, 대부분의 경우 iterable이 아닙니다. 문자열에 대해이 작업을 수행 할 수있는 이유는 반복 가능한 개체이기 때문입니다. 바로이 작업을 수행하지 않은 이유입니다. 큰

def process_list(_list): 
    return map(lambda x: process_list(x) if type(x)==list else x+1, _list) 
+0

: 당신은 정말 정말 당신이 할 수있는 가장 좋은 것은 직접 사용지도는 당신의 루프 ... 그냥

for x in _list: if is_list(x): new_list.append(process_list(x)) else: new_list.append(x+1) 

을 할 수에서 모두 map()를 사용할 필요가 없습니다! 고맙습니다 – konrad

0

시도는 else 절을 수정, 감사합니다. map 또는 lambda이 필요 없습니다.

import types 

def process_list(_list): 
    new_list = [] 
    for x in _list: 
     if is_list(x): 
      new_list.append(process_list(x)) 
     else: 
      new_list.append(x+1) 
    return new_list 

def is_list(l): 
    return type(l) == types.ListType 

_list = [[[0,1,2],[0,1,2],[0,1,2]],[0,1,2]] 

print process_list(_list) 

결과 : 더 map처럼 보이도록 process_list 호출을 원하는 경우에

[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [1, 2, 3]] 

, 당신은 처리의 종류가 수행되어야 하는지를 나타내는 추가 매개 변수를 필요로 할 수 있습니다. isinstance

import types 

def process_list(func, _list): 
    new_list = [] 
    for x in _list: 
     if is_list(x): 
      new_list.append(process_list(func, x)) 
     else: 
      new_list.append(func(x)) 
    return new_list 

def is_list(l): 
    return type(l) == types.ListType 

_list = [[[0,1,2],[0,1,2],[0,1,2]],[0,1,2]] 

print process_list(lambda x: x+1, _list) 
0

검사는 유형이 무엇인지 확인하고 그 당신의 논리를 기반으로합니다 :

def process_list(_list): 
    new_list = [] 
    for x in _list: 
     if isinstance(x, list): 
      new_list.append(process_list(x)) 
     elif isinstance(x, (int, float)): 
      new_list.append(x+1)     
     else: 
      new_list.append(map(lambda y: y + 1, x)) 
    return new_list 

당신이 목록을 확인 후 당신은 또한, 반복 가능한 요소를 찾기 위해 collections.Iterable을 사용할 수 있습니다

from collections import Iterable 
def process_list(_list): 
    new_list = [] 
    for x in _list: 
     if isinstance(x, list): 
      new_list.append(process_list(x)) 
     elif isinstance(x, Iterable): 
      new_list.append(map(lambda y: y + 1, x)) 
     else: 
      new_list.append(x+1) 
    return new_list