我有一些嵌套列表,我希望能够对其进行修改,并具有进行修改的位置的索引。
此类列表的一个示例是:
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
列表可以有任意数量的嵌套列表,因此索引的长度可能会改变。 该功能需要适用于任何嵌套列表和任意数量的索引。
答案 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']]]