1

ネストされたリストを含むリストmodify_listがあり、タプルを取得し、渡されたポインターを渡された値の引数で変更する関数()を作成したいと思います。問題は、このようなネストされた値を参照によってプログラムで変更する方法がわからないことです。

簡略化した例:

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

関数を呼び出すと、modify_listその使用方法と期待される結果は次のようになります。

> 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]]]]

ありがとう

4

3 に答える 3

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キーがタプルであると考えましたか?

于 2012-06-10T18:22:54.267 に答える
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]]]]
于 2012-06-10T18:28:07.660 に答える
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]]]]
于 2012-06-10T18:29:22.280 に答える