2017-10-19 77 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')會做伎倆。

但是......坦率地說......我對這個解決方案並不滿意,必須有一種更流暢的Python方法來實現這一點。我可能錯過了一些東西。

任何人都可以想到更動態的方式,我不必預先定義可能級別的最大數量?

編輯:

在上面的例子中,我得到了我想要改變,這使得該方法列表中的指數似乎有點過於複雜。但是,在我的具體情況中,我實際上需要使用某個項目的索引來更改另一個具有相同結構的列表中的另一個項目。

所以我必須堅持使用索引列表。

+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