递归嵌套列表

3

我在递归嵌套列表的问题上有些困惑。问题是:需要定义一个过程来访问任意深度的嵌套列表。它将接受一个嵌套列表和一个索引,并返回该索引处的列表部分。从给定函数中,递归查找给定索引处的值。

例如

这里有一个更好的可视化表示。要选择其中的元素9,我们需要做一些类似于nested[3][1]的操作。

    nested = \
    [[[1, 2],
      3],
     [4,
      [5, 6]],
     7,
     [8, 9, 10]]

recursive_func(nested_list, [3,1]) #recursive function definition, the second argument is the index at which the data needs to be retrieved.  
>>> 9 #so given the function an index of [3,1] would return 9

Any help to point me in the right direction would be grateful


4
你能澄清该函数应该做什么吗?如果这是作业,请加上标签。 - Eli Bendersky
1
@Ben:正如@Eli所说,你需要更好地说明问题。一种方法是提供更多的例子来解释。目前的例子中输入和输出之间的转化过程非常不清晰。 - Björn Pollex
1
我不太理解您的例子。[3,1]是什么意思?带索引3的列表和带索引1的元素?这个查询的值怎么可能是1呢?难道应该请求[2,0]吗? - tgmath
[3,1] 表示您想要深度为 3 的第一个元素吗? - verdesmarald
@veredesmarald 是的,没错 - Benji
@Ben E:在你的例子中,结果行仍然是错误的,应该是9而不是1。 - verdesmarald
2个回答

1

这可能对你有用,但我仍然不确定你在寻找什么...

>>> def findItem(nested, pos):
    if pos[0] == 1:
        return nested[pos[1]-1]
    else:
        nextLevelDown = []
        for item in nested:
            if type(item) == type([]):
                nextLevelDown = nextLevelDown + item
        return findItem(nextLevelDown, [pos[0]-1, pos[1]])

>>> findItem([[[1, 2], 3], 4], [3, 1])
1
>>> findItem([[[1, 2], [3]], 4], [3, 3])
3
>>> findItem([[[1, 2], [3]], 4], [2, 2])
[3]

更新:经过多次来回沟通,我终于理解了这个问题,它比起一开始看上去要简单得多,你所需要的只是:

>>> def recursiveRef(nested, idxList):
    if len(idxList) > 1:
        return recursiveRef(nested[idxList[0]], idxList[1:])
    return nested[idxList[0]] 

>>> recursiveRef([[[1, 2], 3], [4, [5, 6]], 7, [8, 9, 10]], [3, 1])
9

@veredesmarald 我刚试了一下 findItem([[[1, 2], 3], [4, [5, 6]], 7, [8, 9, 10]], [3, 1]) >>> 应该是 9。感谢你的尝试,我现在开始理解如何尝试这些问题了。 - Benji
嵌套 =
[[[1, 2], 3], [4, [5, 6]], 7, [8, 9, 10]]'这里有一个更好的可视化表示。要选择其中的元素9,我们需要执行类似于 嵌套[3][1]的操作。
- Benji
<pre>标签在评论中不起作用,所以没有什么帮助。 :( 尝试将附加示例添加到原始问题中。 - verdesmarald
@veredesmarald,我更新了那篇帖子,请检查一下,还要感谢你迄今为止的帮助。我发现我的作业问题措辞不好,所以更难理解。 - Benji
@verdesmarald 对不起,今天有点忙,没有校对。感谢您帮助理解问题。 - Benji
显示剩余4条评论

0

如果我理解正确,您想将嵌套列表简单地转换为非嵌套列表?然后再检查索引?如果是这样,那么您可以尝试类似于以下的代码(我目前没有Python,所以请将其视为伪代码):

def unwrap_list(list, result):
   if type(list) == type([]):
      for value in list:
         unwrap_list(value, result)
   else:
      result.append(list)

请确保在调用此函数之前定义变量unwrapped = [],并使用unwrap_list(list, unwrapped)。结果将存储在变量unwrapped中。

我不确定这个代码是如何生成 OP 所要求的答案的?(即,对于给定的输入,生成 1 - Eli Bendersky
好的,如果我理解正确的话,那么首先你要调用 unwrap_list(nested_list, result),然后只需检查 result[index]。我不太理解 recursive_func(nested_list, [3,1]) 中的第二个参数(我假设这是一个错误,应该是 recursive_func(nested_list, 1)),但我写的是在这种情况下进行递归的提示。 - freakish
第二个参数是嵌套列表的索引。它是我想要检索数据的位置。因此,在位置[3,1]会返回整数1。 - Benji
@Ben E:为什么 [3, 1] 是一个位置?它是一个列表。你能解释一下它的含义吗? - Eli Bendersky
好位置是指作为列表索引的位置。例如,n = [1,2,3] 要访问 2,它将使用索引 1 (n[1])。 - Benji

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接