python - 动态访问嵌套列表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))
(我知道这是一个元组的元组,但只是假设它是一个列表的列表。我有一个单独的函数可以在调用其他任何东西之前将一个元组的元组转换为一个列表的列表)
我尝试使用深层副本,s
但indices
我得到了同样的错误。我确定如果我只daccess
在主文件中使用正确的参数调用它,它会起作用,但我真的不知道在里面调用它时出了什么问题fnc
。
任何有关为什么会发生这种情况的帮助表示赞赏。
解决方案
根据您的评论,您希望保持列表结构完整,但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)
推荐阅读
- linux - 如何批量创建 ssh 信任?
- jquery - 表单加载中下拉列表中的jQuery defaultValue
- php - 如何在将 URL 传递给 htaccess 文件中的处理程序之前去除 URL 的开头
- c# - 如何从不同的方法访问 Main() 中的变量
- spring - LDAP 查询产生以“ldap://”开头的条目
- c# - 我怎样才能让这个调用线程保存?
- java - JdbcTemplate 映射器空值
- go - 运行 dep ensure 时出错:清单、锁和供应商的分组写入:无法统计 VerifyVendor 声称存在的文件
- c# - Mailkit 和 Mimekit 的标头编码问题
- python - Is there an easy way to use logarithmic scale on matplotlib plots displaying data via a custom function (wedge)?