如何访问任意深度列表?

时间:2017-10-21 20:22:26

标签: python list

我有一个名为ClassCastException : class test.java.Root can t be cast to test.java.Root 的列表,可以是等于或大于data的任何深度。

e.g;

有时1

data = [3,65,3] ......等等。

考虑到它的深度可能波动,我通常如何访问data = [[3,65,3],[88,44,9],[6,2,21]]?它假定访问元素(数字)的深度和索引将始终是已知的。

假设我有一个带有任意参数的函数data。我如何概括以下内容?

f

3 个答案:

答案 0 :(得分:2)

您可以根据您提供的索引数量迭代访问子列表,这隐含意味着深度。如果您不相信用户始终提供有效索引,则可以进一步检查参数的合法性。

def f(*indices):
    element = data
    for index in indices:
        element = element[index]
    return element

您还可以编辑某个索引处的值,这将在适当的位置完成。

def f(indices, value):
    if not len(indices):
        return
    element = data
    for index in indices[:-1]:
        element = element[index]
    element[indices[-1]] = value

indices应该是一个循环,因此您需要将其称为f((1, 1), 5)。相反,如果您更喜欢将其称为f(1, 1, 5),其中所有参数都是索引而ast是新值,则将函数更改为

def f(*args):
    indices, value = args[:-1], args[-1]
    # then the same as above

答案 1 :(得分:0)

考虑您的输入将是这样的:

data = [[3,65,3],[88,44,[9, 4, 56]],[6,2,21]]
你可以像这样压扁它:

def flatten(l):
     r = []
     for e in l:
         if isinstance(e, list):
            r += flatten(e)
         else:
            r.append(e)
     return r

<强>输出:

>>> flatten([[3,65,3],[88,44,[9, 4, 56]],[6,2,21]])
[3, 65, 3, 88, 44, 9, 4, 56, 6, 2, 21]

答案 2 :(得分:0)

使用生成器的另一种递归解决方案:

def flatten(s):
  if not isinstance(s, list):
      yield s
  else:
      for i in s:
          for b in flatten(i):
              yield b

print(list(flatten([[3,65,[3, [[5, 6, [2, 6, [4]]]]],[88,44,[9, 4, 56]],[6,2,21]]])))

输出:

[3, 65, 3, 5, 6, 2, 6, 4, 88, 44, 9, 4, 56, 6, 2, 21]