我有以下两个清单:
l1 = [2, 3, 2]
l2 = [0, [0, 1], [0, 1, 0, [0, 1, [0, 0]]]]
如何将第一个列表用作树索引,以便将项目附加到第二个列表,如执行
l2[2][3][2].append(0)
答案 0 :(得分:3)
没有标准的方法可以做到这一点,但这将有效:
from functools import reduce
from operator import getitem
def tree_index(tree, index):
return reduce(getitem, index, tree)
tree_index(l2, l1).append(0)
作为奖励,tree_index
功能也适用于词典和任何其他映射。例如:
>>> adjs = {'apple': ['red', 'green'], 'swallow': ['african', 'european'] }
>>> tree_index(adjs, ['apples', 0])
'red'
另一方面,tree_index
不适用于作业。这不起作用:
tree_index(l2, [1,1]) = 33 # throws SyntaxError
为了分配树索引,您需要另一个函数或部分索引:
tree_index(l2, [1])[1] = 33
答案 1 :(得分:1)
您可以使用reduce
功能:
In [1]: l1 = [2, 3, 2]
In [2]: l2 = [0, [0, 1], [0, 1, 0, [0, 1, [0, 0]]]]
In [3]: from functools import reduce
In [4]: reduce(lambda l, i: l[i], l1, l2)
Out[4]: [0, 0]
In [5]: l2[2][3][2]
Out[5]: [0, 0]
答案 2 :(得分:1)
这应该有效
def tree_append(tree, index_list', val=None):
for index in index_list:
tree = tree[index]
tree.append(val)
l1 = [2, 3, 2]
l2 = [0, [0, 1], [0, 1, 0, [0, 1, [0, 0]]]]
tree_append(l2, l1, val=0)
>> l2
[0, [0, 1], [0, 1, 0, [0, 1, [0, 0. 0]]]]
答案 3 :(得分:0)
只有当你知道自己在做什么时才这样做:
l1 = [2, 3, 2]
l2 = [0, [0, 1], [0, 1, 0, [0, 1, [0, 0]]]]
str1=repr(l1)
str1=str1.replace(', ','][') # str1=[2][3][2]
eval(repr(l2)+str1) # or var=exec(repr(l2)+str1)
答案 4 :(得分:0)
由于一些奇怪的原因,我立即想到了一个递归例程,但实际上它确实做了Kostas正在做的事情,我发现它更容易理解:
def tree_appender(tree, location, thing):
sub_tree_index = location.pop(0)
if len(location) > 0:
tree_appender(tree[sub_tree_index], location, thing)
else:
tree[sub_tree_index].append(thing)
return
>>> l1 = [2, 3, 2]
>>> l2 = [0, [0, 1], [0, 1, 0, [0, 1, [0, 0]]]]
>>> python_file.tree_appender(l2, l1, "dave")
>>> l2
[0, [0, 1], [0, 1, 0, [0, 1, [0, 0, 'dave']]]]
如果l1为[0],那么它当然会失败,因为l2 [0]是一个int而不是一个列表。如果可能需要的话,你可以测试一下并将任何附加的内容转换成一个列表。