2017-10-19 8 views
1

未知の深度のネストされたリスト内の特定のアイテムを変更するためのより良いソリューションを探しています。Pythonで深さが不明なネストされたリスト内の特定のアイテムを動的に変更します

私はリストlst = ['a', 'b', [['c'], ['d', ['e', 'f']]]を持っており、'e''x'に変更したいとします。 私は単純にハードコーディングすることによってこれを行うことができます:

lst[2][1][1][0] = 'x' 

しかし、私は別の項目を変更する指標の未知の番号を使用する必要があると思います。例えば、'c'を変更すると、3つのインデックスしか必要としません。

私はすでに特定のアイテムの希望インデックスを返す関数を書いて、それが少しよりダイナミックにするために、この場合にはindices = get_indices('e', lst)がリストに[2, 1, 1, 0]

を返しますので、私の現在のソリューションは、次の関数です。

def set_element(lst, index, value): 
    levels = len(index) 
    if levels == 1: 
     lst[index[0]] = value 
    elif levels == 2: 
     lst[index[0]][index[1]] = value 
    elif levels == 3: 
     lst[index[0]][index[1]][index[2]] = value 
    elif levels == 4: 
     lst[index[0]][index[1]][index[2]][index[3]] = value 
    elif levels == 5: 
     lst[index[0]][index[1]][index[2]][index[3]][index[4]] = value 
    elif levels == 6: 
     lst[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]] = value 
    else: 
     return False 
    return True 

set_element(lst, indices, 'x')を呼び出すと、トリックを行うだろう。

しかし... ...私はこの解決策には満足していません。これを達成するためには、よりスムーズで無色の方法が必要です。私はおそらく何かが欠けているでしょう。

可能なレベルの最大数を事前に定義する必要がない、もっとダイナミックな方法を誰もが考えることができますか?

EDIT:上記の例で

私はこの方法は少し過度に複雑思われてしまうた、私が変更したいのですが、リストからインデックスを持っています。しかし、私の具体的なケースでは、実際には、同じ構造の別のリスト内の別の項目を変更するために項目のインデックスを使用する必要があります。

私はインデックスのリストを使用することを主張する必要があります。

+0

「再帰」を利用しています。あなたの事件は非常に典型的なものであるので、それをグーグルで探そうとします。 –

答えて

1

私は本当にあなたの関数get_indicesがすでに問題にほとんどの答えであると信じてい- あなたは要素を見つけるだけのとき - それを変更します! =)

が、答えとして - 使用再帰(おそらくfind_indicesで使用されるような)

def set_element(lst, index, value): 
    if(len(index)==1): 
     lst[index[0]] = value 
    else: 
     set_element(lst[index[0]],index[1:],value) 
+0

それは本当です、私はそれを見つけたときにそれを変更することができました。しかし、私は、特定の商品のインデックスを使用することが重要であるということを忘れてしまったのは残念です。それで、私は非常に便利な、非常に同じ構造の別のリストの同じ位置にアイテムを変更することができます...あなたの答えは素晴らしい、ありがとう。 – user1111111

1

これはどう:それはあなたのケースのために少し具体的だが、それが動作する

lst = ['a', 'b', [['c'], ['d', ['e', 'f']]]] 

def change(seq, what, make): 
    for i, item in enumerate(seq): 
    if item == what: 
     seq[i] = make 
    elif type(item) == list: 
     change(item, what, make) 
    return lst 

print(change(lst, 'c', 'k')) 
#['a', 'b', [['k'], ['d', ['e', 'f']]]] 

+0

残念ながら、インデックスを使用することは非常に重要であることを忘れています。そのため、同じ構造の別のリスト内のアイテムの正確な位置でアイテムを変更することができます。しかしそれとは別に、間違いなく非常に良い解決策です。 – user1111111

関連する問題