如何在Python中创建一个创建多个空列表的循环?
我想要一行代码,它将创建一个由递增变量确定名称的空列表 到目前为止,我所看到的每一个地方都无济于事。相反,他们建议做一个空列表或使用字典。这不是我想要的,我想要一行(或几行)代码,只创建一个空列表(它不是字典或列表列表的一部分,一个独立实体)。我希望这些列表是不同的,通过一个变量来区分,该变量在每次创建新的空列表时递增1 这些空列表不能在一开始就在一批中生成,因为我打算在整个递归函数中生成和删除这些列表。我需要创建多个列表,因为我的目的是让这个函数下降到一个新的递归级别,但稍后返回到上一个列表。它们充当临时工作列表,为原始列表的每个项目计算一个值,然后在找到结果后将其复制到最终列表中如何在Python中创建一个创建多个空列表的循环?,python,list,loops,dictionary,Python,List,Loops,Dictionary,我想要一行代码,它将创建一个由递增变量确定名称的空列表 到目前为止,我所看到的每一个地方都无济于事。相反,他们建议做一个空列表或使用字典。这不是我想要的,我想要一行(或几行)代码,只创建一个空列表(它不是字典或列表列表的一部分,一个独立实体)。我希望这些列表是不同的,通过一个变量来区分,该变量在每次创建新的空列表时递增1 这些空列表不能在一开始就在一批中生成,因为我打算在整个递归函数中生成和删除这些列表。我需要创建多个列表,因为我的目的是让这个函数下降到一个新的递归级别,但稍后返回到上一个列表。
str("list_" + i) = []
如果i=1,那么我希望这行代码创建一个名为“list_1”的空列表,我可以在整个脚本中继续与之交互
相反,我遇到了“SyntaxError:cannotassigntofunctioncall”
无论如何,如果我没有任何意义,请告诉我,我会尽力表达我的要求。强烈建议不要这样做,但这会根据您的使用情况实现您想要的:
globals()['list_' + str(i)] = []
for i in range(5):
globals()['list_' + str(i)] = []
list_1
[]
list_2
[]
etc...
根据您的用例,切换全局变量
,切换局部变量
,反之亦然
更好的办法是defaultdict
from collections import defaultdict
my_lists = defaultdict(list)
现在,您不必初始化任何列表,直到您使用它,并且每个键的值都已经是一个列表
。例如:
for i in range(5):
my_lists['list_' + str(i)].append('foo')
my_lists
defaultdict(list,
{'list_0': ['foo'],
'list_1': ['foo'],
'list_2': ['foo'],
'list_3': ['foo'],
'list_4': ['foo']})
这是不好的做法,但无论如何:
for i in range(10): # for global vars
globals()["list_" + str(i)] = []
print(list_0) # []
也许你要找的是一本字典:
items = dict()
for i in range(10): # for dictionary
items[str("list_" + i)] = []
print(items.list_0) # []
避免使用globals
,使用defaultdict
使用a既高效又易于管理。添加到列表值时,不需要显式添加键:
from collections import defaultdict
dd = defaultdict(list)
dd['list_0'].append('foo')
print(dd)
# defaultdict(<class 'list'>, {'list_0': ['foo']})
从集合导入defaultdict
dd=默认DICT(列表)
dd['list_0'].追加('foo')
印刷品(dd)
#defaultdict(,{'list_0':['foo']})
如果要显式添加键,即使列表值为空,也可以通过输入一个额外参数来实现:
from collections import defaultdict
dd = defaultdict(list, **{k: [] for k in [f'list_{i}' for i in range(5)]})
print(dd)
# defaultdict(<class 'list'>, {'list_0': [], 'list_1': [], 'list_2': [],
# 'list_3': [], 'list_4': []})
从集合导入defaultdict
dd=defaultdict(list,**{k:[]表示范围(5)]中i的[f'list_{i}'中的k)
印刷品(dd)
#defaultdict(,{'list_0':[],'list_1':[],'list_2':[],
#'列表3':[],'列表4':[]}
你知道人们建议你想要的东西以外的东西是有原因的吗?你想要一个数量可变的变量(这是重复的),它只会产生可怕的代码,无法正确地遵循。老实说,defaultdict(list)
听起来很理想,即使你说不是。虽然这种方法在技术上可能是可行的,但我建议不要。有更简单的方法来获取列表。我假设您是一名新的Python开发人员,在这种情况下,欢迎!听起来你想要的东西不太方便管理。我不认为这是个好主意,我强烈建议为此使用字典。你确定你的递归算法不能只处理局部变量中的列表吗?如果在函数体中执行类似于local\u list=[]
的操作,则每次调用函数时都会创建一个单独的空列表。它不会与其他调用共享列表,无论是更早还是更晚,除非您编写代码让它这样做。处理局部变量比使用全局变量要好得多。这是我所见过的Python问题中最不具Python风格的正确答案。强烈建议使用defaultdict
解决方案!非常确定代码会以循环的方式向您展示如何做到这一点是的,我很笨,不必担心问了一个愚蠢的问题。在我看来,globals
解决方案应该被删除或降级为注释。实际上,defaultdict
是唯一推荐的解决方案。这在几个方面是不正确的<代码>项目[str(“list_“+i)]=[]但是项目
不存在,这是一个打字错误,我不理解MyClass
的意义,因为它甚至没有正确定义1。如何设置全局属性2。如何设置对象属性3。为什么你可能想使用字典。当然,如果你没有对象,就不要使用对象,也许我应该做一个ClearRok,那么完全无效的代码是怎么做的?这只是抛出错误。这是误导,我完全删除它,感谢反馈