如何修改嵌套列表的内容?

时间:2019-06-02 21:20:00

标签: python list nested

我有一些嵌套列表,我希望能够对其进行修改,并具有进行修改的位置的索引。

此类列表的一个示例是:

l2 = ['Node_50',
      ['Node_48', 'Node_23', ['Node_12', 'Node_3'], ['Node_20']],
      ['Node_22', ['Node_44'], ['Node_7', 'Node_40']]
     ]

然后我有了一个新的元素列表和一个包含索引的列表

lnew = ['Node_1', 'Node_40', 'Node_17']
indexes = [1, 3]

我想获得一个函数,该函数在值的新列表给定的索引处替换列表的元素。该函数必须这样做(对于本示例):

l2[1][3] = lnew

列表可以有任意数量的嵌套列表,因此索引的长度可能会改变。 该功能需要适用于任何嵌套列表和任意数量的索引。

3 个答案:

答案 0 :(得分:2)

简称是:

l2 = ['Node_50',
      ['Node_48', 'Node_23', ['Node_12', 'Node_3'], ['Node_20']],
      ['Node_22', ['Node_44'], ['Node_7', 'Node_40']]
     ]


lnew = ['Node_1', 'Node_40', 'Node_17']
indexes = [1, 3]


def set_deep(root, indexes, value):

    for x in indexes[:-1]:
        root = root[x]
    root[indexes[-1]] = value


set_deep(l2, indexes, lnew)


print(l2)

考虑一下,功能列表[iterable]应该添加到Python中。 我认为实际上numpy支持list [list]表示法吗?

答案 1 :(得分:2)

我认为user8426627已经给出了很好的答案,但是如果您喜欢功能样式,则可以执行以下操作:

>>> from functools import reduce
>>> from operator import getitem
>>> reduce(getitem, indexes[:-1], l2)[indexes[-1]] = lnew
>>> l2
['Node_50',
  ['Node_48', 'Node_23', ['Node_12', 'Node_3'], ['Node_1', 'Node_40', 'Node_17']],
  ['Node_22', ['Node_44'], ['Node_7', 'Node_40']]]

答案 2 :(得分:0)

您不需要功能,只需将新列表分配到所需位置,它将替换之前的值。

l2 = ['Node_50',
       ['Node_48', 'Node_23', ['Node_12', 'Node_3'], ['Node_20']],
       ['Node_22', ['Node_44'], ['Node_7', 'Node_40']]
      ]
lnew = ['Node_1', 'Node_40', 'Node_17']

之前

l2[1][3]

返回

['Node_20']

然后替换

l2[1][3] = lnew

之后

l2[1][3]

返回

['Node_1', 'Node_40', 'Node_17']

这也可以通过功能

完成
def myFUN(LIST, newLIST, indexes):
    i,j = indexes
    if i >= len(LIST):
        print("list index (" + str(i) + ") out of range")
        return
    elif j >= len(LIST[i]):
        print("list index (" + str(j) + ") out of range")
        return
    else:
        LIST[i][j] = newLIST
        return LIST

现在

myFUN(l2, lnew, indexes)

返回

['Node_50', ['Node_48', 'Node_23', ['Node_12', 'Node_3'], ['Node_1', 'Node_40', 'Node_17']], ['Node_22', ['Node_44'], ['Node_7', 'Node_40']]]

但是

myFUN(l2, lnew, (4,1))

返回

list index (4) out of range

myFUN(l2, lnew, (1,25))

返回

list index (25) out of range

保留原始列表不变

对于python3

def myFUN(LIST, newLIST, indexes):
    res = LIST.copy()
    i,j = indexes
    if i >= len(LIST):
        print("list index (" + str(i) + ") out of range")
        return
    elif j >= len(LIST[i]):
        print("list index (" + str(j) + ") out of range")
        return
    else:
        res[i][j] = newLIST
        return res

在python 2中使用res = LIST[:]res=list(LIST)。现在

myFUN(l2, lnew, indexes)

返回

['Node_50', ['Node_48', 'Node_23', ['Node_12', 'Node_3'], ['Node_1', 'Node_40', 'Node_17']], ['Node_22', ['Node_44'], ['Node_7', 'Node_40']]]

但是l2保持不变

l2

返回

['Node_50', ['Node_48', 'Node_23', ['Node_12', 'Node_3'], ['Node_20']], ['Node_22', ['Node_44'], ['Node_7', 'Node_40']]]