如何到达随机嵌套列表中未列出的每个元素?

How to reach every single element which is not list in random nested list?

假设有如下列表,请务必注意这是一个任意列表,以证明该列表包含具有 strings/numeric 个值的完全随机列表:

[[["1"],"1"],["2",[["123",[[["23"]]],23],[12.3,"23"]]],[["5"],"1","1"]]

我想获取此列表中的每一项,但我只想获取数字或字符串而不是列表。比方说,我创建了一个只接受字符串、整数和浮点数但不接受列表的函数。我想用这个功能

我想根据函数的输出创建相同的列表,但对象不同。假设函数将字符串转换为数值。我想创建一个这样的列表:

[[[1],1],[2,[[123,[[[23]]],23],[12.3,23]]],[[5],1,1]]

我想了又想不出答案。我该怎么做?

您可能想要递归地遍历整个结构,然后存储结果或直接在结果上调用您的函数。它看起来像这样:

sample = [[["1"],"1"],["2",[["123",[[["23"]]],23],[12.3,"23"]]],[["5"],"1","1"]]
def traverse(l, f):
    result = []
    for item in l:
        if isinstance(item, list):
            result.append(traverse(item))
        else:
            result.append(f(item))
    return result

这是一个类似于嵌套 map:

的非常简单尝试的函数
def map_nested(fnc, l):
    try: 
        return fnc(l)
    except:
        return [map_nested(fnc, sub) for sub in l]

>>> l = [[["1"],"1"],["2",[["123",[[["23"]]],23],[12.3,"23"]]],[["5"],"1","1"]]
>>> map_nested(float, l)
[[[1.0], 1.0], [2.0, [[123.0, [[[23.0]]], 23.0], [12.3, 23.0]]], [[5.0], 1.0, 1.0]]

它会将提供的函数 fnc 应用于 l 中作为该函数(或 l 本身)有效参数的所有项目,并尝试迭代其他项目。