首页 > 解决方案 > 动态访问嵌套列表python中的元素

问题描述

我有一个遍历列表并在元素为整数时打印元素的函数,如下所示:

def fnc(s, d = 0, lst=[0]):
    if isinstance(s, (tuple, list)):
        for i, elt in enumerate(s):
            if isinstance(elt, int):
                # print(f'{s}, {d}, {i}, {lst}')
                daccess(s, d, i, lst)
            else:
                lst.append(i)
                fnc(elt, d+1, lst)
                lst.pop(-1)

daccess定义如下:

def daccess(lst, d, i, indices):
    if d == 0:
        print(lst[i])
    else:
        lst_index = lst[indices.pop(1)]
        daccess(lst_index, d-1, i, indices)

fnc应该s, d, i, lst作为参数传递给daccess其中 s 是嵌套列表,d 是要访问的元素的深度,i 是它的索引位置,lst 是遇到的每个嵌套列表的索引的跟踪。例如用 (s=[1,2,[3,[4,5,6]]], d=2, i=1, lst=[0,2,1]) 可以翻译成 s[2] [1][1] == 5。

fnc当我将第5 行(已注释掉)打印的参数传递给 时daccess,它按预期工作:

daccess(s, 0, 1, [0])
daccess(s, 0, 0, [0])
...
daccess(s, 1, 0, [0, 8])
daccess(s, 1, 1, [0, 8])
etc...

但是,当daccess 在内部 fnc调用时(所以只调用 fnc(s) 我得到这个错误:

1
2
33
6425
64
Traceback (most recent call last):
  File "fa.py", line 56, in <module>
    fnc(s)
  File "fa.py", line 20, in fnc
    fnc(elt, d+1, lst)
  File "fa.py", line 17, in fnc
    daccess(s, d, i, lst)
  File "fa.py", line 8, in daccess
    lst_index = lst[indices.pop(1)]
IndexError: pop index out of range

s 定义如下: s = (1, 2, 33,6425, (3, 4, 44, (5, 66, 63225, 25673547, 88), (64,121)), 9, 10, 11, (89, 90))

(我知道这是一个元组的元组,但只是假设它是一个列表的列表。我有一个单独的函数可以在调用其他任何东西之前将一个元组的元组转换为一个列表的列表)

我尝试使用深层副本,sindices我得到了同样的错误。我确定如果我只daccess在主文件中使用正确的参数调用它,它会起作用,但我真的不知道在里面调用它时出了什么问题fnc

任何有关为什么会发生这种情况的帮助表示赞赏。

标签: pythonlistrecursionnested

解决方案


根据您的评论,您希望保持列表结构完整,但str对每个不可迭代元素(推断)执行一些操作 ()。

这如何避免所有的弹出和索引?

from typing import Iterable
def fnc(s):
  if isinstance(s, Iterable) and not isinstance(s, (str, bytes)):
    return [fnc(e) for e in s]
  else:
    return str(s)

推荐阅读