2014-09-13 3 views
0

아래 코드는 travrse_it에서 반환 할 때 전달 된 구조가 수정되지 않은 경우 구조체를 통과하는 것처럼 보입니다. leafs는 불변이므로 반환해야한다고 가정합니다.임의의 구조체의 모든 리프 노드에서 여분의 공백을 제거하는 방법

r = ['crossABC', ['A', 'B', 'C'], ['r  n w ', 'r  n r ', 'r  n n ', 'n  w   w ', 'n  w   r ', 'n  w  n', 'n  r w ', 'n  r r ', 'n  r n ', 'n  n w ', 'n  n r ', 'n  n n ']] 

rm_space = lambda x: re.sub('\s+', ' ', x) 

def traverse_it(it, str_func): 
    if (isinstance(it, list)): 
    for item in it: 
     traverse_it(item, str_func) 
    elif (isinstance(it, dict)): 
    for key in it.keys(): 
     traverse_it(it[key], str_func) 
    elif (isinstance(it, basestring)): 
    return str_func(it) 
    else: 
    print "Cant travers unkown item" 

traverse_it(r,rm_space) 

예상 출력 :

r = ['crossABC', ['A', 'B', 'C'], ['r n w ', 'r n r ', 'r n n ', 'n w w ', 'n w r ', 'n w n', 'n r w ', 'n r r ', 'n r n ', 'n n w ', 'n n r ', 'n n n ']] 

답변

1

간단하게 값을 returing하는 항목에 영향을주지 않습니다 누군가는 내가 잘못 여기서 뭐하는 거지 지적 할 수 있습니다. 반환 값을 다시 지정해야합니다. 코드도 list, dict 유형으로 반환해야합니다.

def traverse_it(it, str_func): 
    if isinstance(it, list): 
     for i, item in enumerate(it): 
      it[i] = traverse_it(item, str_func) 
     return it 
    elif isinstance(it, dict): 
     for key in it: 
      it[key] = traverse_it(it[key], str_func) 
     return it 
    elif isinstance(it, basestring): 
     return str_func(it) 
    else: 
     print "Cant travers unkown item" 
관련 문제