Python 如何迭代创建新变量以存储列表的第i个值
我想写一个函数,它接受Python 如何迭代创建新变量以存储列表的第i个值,python,loops,lambda,Python,Loops,Lambda,我想写一个函数,它接受L,一个元组列表(例如L=[(1,0,0),(1,1,0)]),并循环通过L来创建一个新变量t{0}。格式(I)用于L中的第I项。理想情况下,在for循环的末尾,t1=(1,0,0),t2=(1,1,0)。然后我将把元组转换成列表,但我在谷歌上搜索了一下,发现我可以只做t1=list(t1)。但是如何完成第一部分呢?好吧,您可以创建如下全局变量: L = [(1,0,0), (1,1,0)] def make_vars(L): for i, item in enu
L
,一个元组列表(例如L=[(1,0,0),(1,1,0)]
),并循环通过L
来创建一个新变量t{0}。格式(I)
用于L
中的第I
项。理想情况下,在for循环的末尾,t1=(1,0,0),t2=(1,1,0)
。然后我将把元组转换成列表,但我在谷歌上搜索了一下,发现我可以只做t1=list(t1)
。但是如何完成第一部分呢?好吧,您可以创建如下全局变量:
L = [(1,0,0), (1,1,0)]
def make_vars(L):
for i, item in enumerate(L, start=1):
globals()['t{0}'.format(i)] = item
make_vars(L)
print(t1)
# (1, 0, 0)
但实际上,动态命名变量有什么好处?它们很难编程,因为直到运行时你才知道它们的名字。(您可能会猜测(正确或错误)存在t1
,但是否存在t10
?)
使用dict更好:
def make_vars2(L):
return dict(enumerate(L, start=1))
t = make_vars2(L)
print(t[1])
# (1, 0, 0)
使用dict
将所有“变量”捆绑在t
中,您可以准确地知道t
、t.keys()
中的“变量”是什么,并且它们不会污染您的全局命名空间
然而,再仔细想想,你真的需要一个dict
?L
本身就足够了吗?使用L[i]
访问L
中的项目比使用t[i+1]
访问同一项目更快:
In [3]: %timeit t[1]
10000000 loops, best of 3: 66.1 ns per loop
In [4]: %timeit L[0]
10000000 loops, best of 3: 42.8 ns per loop
return dict(enumerate(L,start=1))
甚至return{i:list(v)for i,v in enumerate(L,start=1))}
这非常有效,谢谢。实际上,我一直在研究是否可能使用fromkeys
来实现它,即:对于范围(4)中的I:varlist.append(t(I))>>varlist['t0','t1','t2','t3']>>dict.fromkeys(varlist){'t1':None,'t0':None,'t3':None,'t2':None}但这很有效。但是,我的列表
解决方案似乎不起作用。我可以问你一个关于如何将像(1,0,0,0)
这样的元组转换成像[1,0,0,0]
这样的列表的技巧吗?@JonClements:谢谢你的改进@JJR只是使用list(你的元组)
@JonClements出于某种原因当我尝试这样做时,它给了我一个奇怪的输出:lt=[]对于t中的键:lt.append(list(t[key])
给了我[(0,1)],[(0,1),(1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(7,1)]