如何替换Python中嵌套列表中的所有值(通过函数)?

Pet*_*r.k 1 python nested-lists

有很多建议,但我无法坚持下去。我下面有最接近的解决方案。数据是这样的:

my_list = ([1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8)
Run Code Online (Sandbox Code Playgroud)

和一个函数

def convert(G, l, d):
    z = []
    if isinstance(x, list):
        print(x)
        z.append(convert(G, x, d))
    else:
        print(x)
        z.append([v[d] for n,v in G.nodes(data=True) if n == l])
    return z
Run Code Online (Sandbox Code Playgroud)

执行:

print(convert(G, my_list, "name"))
Run Code Online (Sandbox Code Playgroud)

它给出空数组,但 print(x) 按原样获取源。我想我已经很接近了。问题是我不知道如何作为整数而不是列表l传递。if n == l

编辑

Outpit: (['a', ['b', 'c'], 'd', ['e', ['f' , [], ['g', 'h']], 'j']], 'g) 采用相同的格式(嵌套)。自定义函数仅获取每个元素(int)并从 dict(字母)返回其属性。

另一种尝试:

my_list = ([1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8)
z = []
def convert(G, l, d):
    z.append([convert(G, x, d) if isinstance(x, list) else [v[d] for n,v in G.nodes(data=True) if n == x]])
    return z

z = convert(G, my_`list, "name")
print(z)
Run Code Online (Sandbox Code Playgroud)

这部分是自定义函数:

[v[d] for n,v in G.nodes(data=True) if n == l]
Run Code Online (Sandbox Code Playgroud)

所以G可以是任何东西。你可以把它当作[...]

例如:G.nodes = {0: {'name': 'a'}, 1: {'name': 'b'}, 2: {'name': 'c'}, 3: {'name': 'd'}}

tob*_*s_k 5

看来您正在寻找一种map适用于嵌套列表的函数。尝试这个:

def deepmap(f, lst):
    return [deepmap(f, x) if isinstance(x, list) else f(x) for x in lst]
Run Code Online (Sandbox Code Playgroud)

不过,这会将外部转换tuple为另一个list。如果您需要它是一个元组,或者内部可以有更多元组,则相应地扩展该函数应该不会太难。例子:

>>> my_list = ([1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8)
>>> deepmap(str, my_list)
[['1', ['2', '3'], '4', ['5', ['6', [], ['8', '9']], '10']], '8']
Run Code Online (Sandbox Code Playgroud)

在你的情况下,映射函数f可能是这样的,但并不完全确定。(您可能还想更改G.nodes数据结构,这样您就不必迭代所有项目,而是可以x直接访问项目。)

f = lambda x: next(v[d] for n,v in G.nodes(data=True) if n == x)
Run Code Online (Sandbox Code Playgroud)