如何替换 Python 中嵌套列表中的所有值(通过函数)?
How to replace all values (by a function) in nested list in Python?
有很多建议,但我不能坚持下去。我在下面有最接近的解决方案。数据是这样的:
my_list = ([1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8)
和一个函数
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
执行:
print(convert(G, my_list, "name"))
它给出空数组,但 print(x) 按原样获取源。我想我很接近了。问题是我不知道如何在 if n == l
处将 l
作为整数而不是列表传递。
编辑
出口:
(['a', ['b', 'c'], 'd', ['e', ['f' , [], ['g', 'h']], 'j']], 'g)
以相同的格式(嵌套)。自定义函数只获取每个元素 (int) 和 returns 来自 dict (letter) 的属性。
再试一次:
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)
这部分是自定义函数:
[v[d] for n,v in G.nodes(data=True) if n == l]
所以G可以是任何东西。你可以把它当作[...]
例如:G.nodes = {0: {'name': 'a'}, 1: {'name': 'b'}, 2: {'name': 'c'}, 3: {'name': 'd'}}
您似乎在寻找一种适用于嵌套列表的 map
函数。试试这个:
def deepmap(f, lst):
return [deepmap(f, x) if isinstance(x, list) else f(x) for x in lst]
不过,这会将外部 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']
在你的情况下,映射函数 f
可能是这样的,但不完全确定。 (您可能还想更改 G.nodes
数据结构,这样您就不必遍历所有项目,而是可以直接访问项目 x
。)
f = lambda x: next(v[d] for n,v in G.nodes(data=True) if n == x)
定义自定义映射器
import string
def mapper(item):
if not isinstance(item,list):
return d[item]
else:
return [mapper(i) for i in item]
d=dict(zip(range(1, len(string.ascii_lowercase) + 1), string.ascii_lowercase))
映射字典看起来像这样
{1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', 7: 'g', 8:
'h', 9: 'i', 10: 'j', 11: 'k', 12: 'l', 13: 'm', 14: 'n', 15:
'o', 16: 'p', 17: 'q', 18: 'r', 19: 's', 20: 't', 21: 'u', 22:
'v', 23: 'w', 24: 'x', 25: 'y', 26: 'z'}
my_list = ([1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8)
tuple([mapper(i) for i in my_list])
您还可以将 map
函数与自定义映射器一起使用
tuple(map(mapper,my_list))
输出
(['a', ['b', 'c'], 'd', ['e', ['f', [], ['h', 'i']], 'j']], 'h')
你只需要做一个递归函数来做转换:
my_list = ([1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8)
mapping = {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', 7: 'g', 8: 'h', 9: 'i', 10: 'j'}
def convert(inlist):
def transform(x):
if isinstance(x, list):
return convert(x)
else:
return mapping.get(x)
return [transform(x) for x in inlist]
print(convert(my_list))
根据您的结构,简化版本可能如下所示:
def v(x):
return x + 1
def convert(l):
z = []
for x in l:
if isinstance(x, list):
z.append(convert(x))
else:
z.append(v(x))
return z
这会导致预期的嵌套:
>>> convert([[1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8])
[[2, [3, 4], 5, [6, [7, [], [9, 10]], 11]], 9]
有很多建议,但我不能坚持下去。我在下面有最接近的解决方案。数据是这样的:
my_list = ([1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8)
和一个函数
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
执行:
print(convert(G, my_list, "name"))
它给出空数组,但 print(x) 按原样获取源。我想我很接近了。问题是我不知道如何在 if n == l
处将 l
作为整数而不是列表传递。
编辑
出口:
(['a', ['b', 'c'], 'd', ['e', ['f' , [], ['g', 'h']], 'j']], 'g)
以相同的格式(嵌套)。自定义函数只获取每个元素 (int) 和 returns 来自 dict (letter) 的属性。
再试一次:
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)
这部分是自定义函数:
[v[d] for n,v in G.nodes(data=True) if n == l]
所以G可以是任何东西。你可以把它当作[...]
例如:G.nodes = {0: {'name': 'a'}, 1: {'name': 'b'}, 2: {'name': 'c'}, 3: {'name': 'd'}}
您似乎在寻找一种适用于嵌套列表的 map
函数。试试这个:
def deepmap(f, lst):
return [deepmap(f, x) if isinstance(x, list) else f(x) for x in lst]
不过,这会将外部 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']
在你的情况下,映射函数 f
可能是这样的,但不完全确定。 (您可能还想更改 G.nodes
数据结构,这样您就不必遍历所有项目,而是可以直接访问项目 x
。)
f = lambda x: next(v[d] for n,v in G.nodes(data=True) if n == x)
定义自定义映射器
import string
def mapper(item):
if not isinstance(item,list):
return d[item]
else:
return [mapper(i) for i in item]
d=dict(zip(range(1, len(string.ascii_lowercase) + 1), string.ascii_lowercase))
映射字典看起来像这样
{1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', 7: 'g', 8: 'h', 9: 'i', 10: 'j', 11: 'k', 12: 'l', 13: 'm', 14: 'n', 15: 'o', 16: 'p', 17: 'q', 18: 'r', 19: 's', 20: 't', 21: 'u', 22: 'v', 23: 'w', 24: 'x', 25: 'y', 26: 'z'}
my_list = ([1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8)
tuple([mapper(i) for i in my_list])
您还可以将 map
函数与自定义映射器一起使用
tuple(map(mapper,my_list))
输出
(['a', ['b', 'c'], 'd', ['e', ['f', [], ['h', 'i']], 'j']], 'h')
你只需要做一个递归函数来做转换:
my_list = ([1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8)
mapping = {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', 7: 'g', 8: 'h', 9: 'i', 10: 'j'}
def convert(inlist):
def transform(x):
if isinstance(x, list):
return convert(x)
else:
return mapping.get(x)
return [transform(x) for x in inlist]
print(convert(my_list))
根据您的结构,简化版本可能如下所示:
def v(x):
return x + 1
def convert(l):
z = []
for x in l:
if isinstance(x, list):
z.append(convert(x))
else:
z.append(v(x))
return z
这会导致预期的嵌套:
>>> convert([[1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8])
[[2, [3, 4], 5, [6, [7, [], [9, 10]], 11]], 9]