2012-06-10 5 views
1

중첩 목록이있는 목록을 가지고 있으며 튜플을 가져 와서 전달 된 값 인수로 전달 된 포인터를 수정하는 함수 (modify_list)를 만들고 싶습니다. 문제는 참조로 프로그래밍 방식으로 중첩 된 값을 수정하는 방법을 모르겠다는 것입니다.파이썬에서 참조로 중첩 된 값을 참조하십시오.

간단한 예 : I 함수 modify_list를 호출하는 경우

l = [[1, [2,3, [4,5,6]]]] 

,이 그것을 사용하는 방법이 될 것입니다 및 예상 결과 :

> l[0][1][2][2] 
6 

> modify_list((0, 1, 2, 2), 8) 
> l 
[[1, [2,3, [4,5,8]]]] 

> modify_list((0, 1, 1), 14) 
> l 
[[1, [2,14, [4,5,8]]]] 

덕분에

+1

이 숙제인가? 왜 그런 기능이 필요하지 않은가? –

+0

하하하, 숙제가 안됐어. 그 질문이 그렇게 쉽게 보였을 것 같아. 나는 두꺼운 하루를 보내고 있었고 그 문제는 내가 가진 문제를 표현하기 위해 지나치게 단순화되었다. – maraujop

답변

2

각 하위 목록을 확인할 수 있습니다 각 색인으로 액세스하여 값을 할당 할 마지막 인덱스를 사용

def set_nested_val(l, indices, val): 
    for i in indices[:-1]: 
    l = l[i] 
    l[indices[-1]] = val 

이 기능은 임의의 목록에서 작동합니다 (첫 번째 인수), 그리고뿐만 아니라 l합니다. 당신은 항상 l을 수정하려면, functools.partial를 사용

import functools 
l = [[1, [2,3, [4,5,6]]]] 
modify_list = functools.partial(set_nested_val, l) 

목록을 중첩 주 및 접근 값을 모든 인덱스에 의해, 종종 잘못된 데이터 아키텍처의 표시입니다. 키가 튜플 인 dict을 고려 했습니까?

+0

감사합니다. list [index]를 사용하여 마지막 인덱스를 전달하는 것이 충분히 좋을 것이라고 생각하지 않았으므로 막혔습니다. 목록 예제는 내가하려는 일의 단순화 된 예였습니다. 중첩 목록을 작성하는 것이 가장 할 일이 아니라는 것에 동의합니다. – maraujop

2
def modify_list(indices, new_value): 
    x = reduce(lambda x, i: x[i], indices[:-1], l) 
    x[indices[-1]] = new_value 

예 :

>>> l = [[1, [2, 3, [4, 5, 6]]]] 
>>> modify_list((0, 1, 2, 2), 8) 
>>> l 
[[1, [2, 3, [4, 5, 8]]]] 

이 방법은 당신이 당신의 문제를 요구하는 것과 일치하지만 아마 당신이 변이 할 목록을 전달하는 대신 항상 전역을 수정하는 것이 더 의미가 있습니다 변수 :

def modify_list(lst, indices, new_value): 
    x = reduce(lambda x, i: x[i], indices[:-1], lst) 
    x[indices[-1]] = new_value 

>>> l = [[1, [2, 3, [4, 5, 6]]]] 
>>> modify_list(l, (0, 1, 2, 2), 8) 
>>> l 
[[1, [2, 3, [4, 5, 8]]]] 
1

이 시도 :

def modify_list(lst, pos, val): 
    item = lst 
    while len(pos) > 1: 
     item = item[pos[0]] 
     pos = pos[1:] 
    item[pos[0]] = val 
,

또는이 :

def modify_list(lst, pos, val): 
    item = lst 
    for i in pos[:-1]: 
     item = item[i] 
    item[pos[-1]] = val 

또는이 : 어떤 경우에

def modify_list(lst, pos, val): 
    reduce(lambda a, e: a[e], pos[:-1], lst)[pos[-1]] = val 

는, 다음과 같이 사용 :

lst = [[1, [2, 3, [4, 5, 6]]]] 
modify_list(lst, (0, 1, 2, 2), 8) 

lst 
> [[1, [2, 3, [4, 5, 8]]]] 
관련 문제