【问题标题】:python list as index for a nested listpython列表作为嵌套列表的索引
【发布时间】:2016-08-19 10:38:25
【问题描述】:

我有以下两个列表:

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

如何将第一个列表用作树索引,以便将项目附加到第二个列表,就像这样做

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

【问题讨论】:

  • 虽然exec在一般情况下应该避免使用,但您可以尝试一下,完全基于字符串操作(只需将逗号替换为']['并连接到您的命令)。
  • 你能给我一个你的建议的例子吗?谢谢
  • 是的,当然,我发布了一个答案,但您应该知道它完全依赖于字符串并使用称为反射编程的功能,这可能很危险,请参阅this post on SO

标签: python list tree nested append


【解决方案1】:

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

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

【讨论】:

  • 这是一个很好的解决方案,但是 YiFei 的回答更适合我的情况
【解决方案2】:

这应该可以工作

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】:

    你可以使用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]
    

    【讨论】:

      【解决方案4】:

      只有在你知道自己在做什么的情况下才这样做:

      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 时。或者一个 numpy 数组。或者只是数组。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-25
        • 2013-12-18
        • 2019-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多