我想要的是更改列表中具有未知初始形状的所有元素,所以我做了这个辅助函数,但是 有更好的(更短的)方法,还是内置的方法?
和侧面的另一个问题,在哪里存储这种功能的最佳位置> if <没有内置函数,而不是复制粘贴到每个文件或项目中
def getNextList():
yield [1]
yield [[1,2],3]
yield [[1,2,[3]], [4,5],6]
def change(next_list, function):
for i, e in enumerate(next_list):
if(isinstance(e, int)):
next_list[i] = function(next_list[i])
else: change(e, function)
for next_list in getNextList():
change(next_list, lambda x: x+1)
print(next_list)
所需的输出:
[2]
[[2, 3], 4]
[[2, 3, [4]], [5, 6], 7]
编辑: @Colin Schoen不是您标记问题的重复,因为重复两次只会给我一个错误
我猜我发布的解决方案,或者确实更短的@blhsing版本,是解决该特定问题的唯一方法,但是如果我坚持下去,在不同项目中使用该功能的方法是什么?没有重复吗?
答案 0 :(得分:2)
您可以使change
返回一个生成器表达式,以便它可以使用递归调用的返回值:
def change(next_list, function):
return (list(change(e, function)) if isinstance(e, list) else function(e) for e in next_list)
这样:
for changed_list in change(getNextList(), lambda x: x+1):
print(changed_list)
输出:
[2]
[[2, 3], 4]
[[2, 3, [4]], [5, 6], 7]
对于问题的第二部分,您可以将此函数存储在utils.py
环境变量一部分的目录内的单独模块中,例如PYTHONPATH
中,以便任何项目您只需执行from utils import change
,即可在名称空间中使用此功能。