python list作为嵌套列表的索引

时间:2016-08-19 10:38:26

标签: python list tree nested append

我有以下两个清单:

l1 = [2, 3, 2]
l2 = [0, [0, 1], [0, 1, 0, [0, 1, [0, 0]]]]

如何将第一个列表用作树索引,以便将项目附加到第二个列表,如执行

l2[2][3][2].append(0) 

5 个答案:

答案 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而不是一个列表。如果可能需要的话,你可以测试一下并将任何附加的内容转换成一个列表。