【问题标题】:Recursive Nested Lists递归嵌套列表
【发布时间】:2011-05-10 07:31:06
【问题描述】:

我无法解决递归嵌套列表的问题。问题;需要定义一个过程来访问任意深度的嵌套列表。它需要一个嵌套列表和一个索引,并返回该索引处的列表部分。从这个给定的函数中,递归地找到给定索引处的值。

例如

这里有一个更好的视觉表示。要从中选择元素 9,我们需要执行类似的操作 嵌套[3][1]

嵌套 = \ [[[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

任何帮助我指出正确的方向将不胜感激

【问题讨论】:

  • 你能澄清一下这个函数应该做什么吗?另外,如果这是作业,请标记它
  • @Ben:正如@Eli 所说,您需要更好地指定问题。一种方法是提供额外的示例。目前还不清楚您当前示例中的输入如何转换为您显示的输出。
  • 我不明白你的例子。 [3,1] 是什么意思?索引为 3 的列表和索引为 1 的元素?这个查询的值怎么可能是 1?请求应该是 [2,0] 吗?
  • [3,1] 是否表示您想要深度 3 处的第一个元素?
  • @veredesmarald 是的,没错

标签: python list recursion nested


【解决方案1】:

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

>>> 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]) >>> 1 应该是 9。感谢您的尝试,我现在开始了解如何尝试此类问题
  • @Ben E:你是怎么到 9 点的?该列表中深度 3 处的第一个元素确实是 1。9 甚至不是 3 级深,只有 2 ......我希望 9 的索引是 [2, 6],或者可能是 [2, 4]如果您只计算某个深度的整数而不是列表...
  • 有点难以解释。所以 3 深是 [8, 9, 10] 和 1 深 [8, 9, 10] = 9
  • @Ben E:抱歉,我很难理解你的坐标系... [8,9,10] 直接嵌套在最外层列表中时 3 层有多深?除非您能更全面地解释该位置的两个值的含义,否则我认为我无能为力...
  • 'nested = \ [[[1, 2], 3], [4, [5, 6]], 7, [8, 9, 10]]' 那么这里的视觉效果更好表示。要从中选择元素 9,我们需要执行类似 nested[3][1] 的操作
【解决方案2】:

如果我理解正确,您只想将嵌套列表变为非嵌套列表?然后检查索引?如果是这样,那么您可以尝试这样的事情(我目前没有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 用于给定输入)
  • 好吧,如果我理解正确,那么首先你打电话给unwrap_list(nested_list, result),然后检查result[index]。我不太明白recursive_func(nested_list, [3,1]) 中的第二个参数(我认为这是一个错误,应该是recursive_func(nested_list, 1)),但我写的是在这种情况下进行递归的提示。
  • 第二个参数是嵌套列表的索引。它的位置是我要检索的数据。所以在位置 [3,1] 将返回整数 1
  • @Ben E:为什么[3, 1] 是一个职位?这是一个清单。你能解释一下这是什么意思吗?
  • 作为列表中的索引的良好位置。因此,例如 n = [1,2,3] 访问 2 它将使用索引 1 (n[1])
猜你喜欢
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 2021-01-12
  • 2018-06-24
  • 2017-01-13
相关资源
最近更新 更多