首页 > 解决方案 > 更改未知初始形状列表的所有值

问题描述

我想要的是更改具有未知初始形状的列表中的所有元素,所以我制作了这个辅助函数,但是有没有更好(更短)的方法,或者内置的方法来做到这一点?

还有另一个问题,存储这样一个函数的最佳位置在哪里>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 版本是该特定问题的唯一解决方案,但是如果我坚持下去,那么在不复制的情况下,在不同项目中使用该功能的方法是什么?

标签: pythonlist

解决方案


您可以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地使此函数在命名空间中可用.


推荐阅读