我有一个名为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
答案 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]