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的答案更适合我的情况