Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python列表作为嵌套列表的索引_Python_List_Tree_Nested_Append - Fatal编程技术网

python列表作为嵌套列表的索引

python列表作为嵌套列表的索引,python,list,tree,nested,append,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) 您可以使用以下功能: 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

我有以下两个清单:

l1 = [2, 3, 2]
l2 = [0, [0, 1], [0, 1, 0, [0, 1, [0, 0]]]]
如何使用第一个列表作为树索引,以便将项目附加到第二个列表中,如

l2[2][3][2].append(0) 
您可以使用以下功能:

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]
您可以使用以下功能:

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]

没有标准方法可以做到这一点,但这将起作用:

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(l2, [1,1]) = 33 # throws SyntaxError
为了分配给树索引,您需要另一个函数或部分索引:

tree_index(l2, [1])[1] = 33

没有标准方法可以做到这一点,但这将起作用:

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(l2, [1,1]) = 33 # throws SyntaxError
为了分配给树索引,您需要另一个函数或部分索引:

tree_index(l2, [1])[1] = 33
这应该行得通

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]]]]
这应该行得通

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]]]]

只有当你知道自己在做什么时,才能这样做:

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)

只有当你知道自己在做什么时,才能这样做:

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)

出于某种奇怪的原因,我立即想到了一个递归例程,但本质上它做了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而不是list。您可以对此进行测试,如果可能需要的话,可以将任何要添加到其中的内容转换为列表。

出于某种奇怪的原因,我立即想到了一个递归例程,但本质上它与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而不是list。您可以对此进行测试,如果可能需要的话,可以将任何要添加到列表中的内容都添加到列表中。

虽然在一般情况下应该避免使用exec,但您可以完全基于字符串操作来尝试,只需将逗号替换为']['并连接到您的命令。您能给我一个您的建议的例子吗?谢谢,是的,当然,我发布了一个答案,但您应该知道它完全依赖于字符串并使用称为反射编程的功能,这可能是危险的,请参阅。虽然在一般情况下应该避免使用exec,但您可以尝试一下,total基于字符串的逻辑运算只需将逗号替换为']['并连接到您的命令。您能给我一个您的建议的例子吗?谢谢,是的,当然,我发布了一个答案,但您应该知道它完全依赖于字符串并使用称为反射编程的功能,这可能会有潜在的危险,请参阅。这肯定会在某个时候适得其反。例如,当有人使用一个元组作为l1。或者一个numpy数组。或者仅仅是数组。这肯定会在某个时候适得其反。例如,当有人使用一个元组作为l1。或者一个numpy数组。或者仅仅是数组。这是一个非常好的解决方案,但是YiFei的答案更适合我的情况。这是一个非常好的解决方案,但是YiFei的答案更适合我的情况