2013-08-27 46 views
0

我有一个名称列表:字符串未被识别为一个列表名称

list_123_456 = [1,2,3] 

然后我用一个文件名的某些部分重新创建这个列表的名称:

name = 'list_{0}_{1}' .format(filename[0:3],filename[6:9]) 

该作品就像我想要的那样,'名字'现在等于'list_123_456'。但是代码将它视为一个字符串而不是我在开始时定义的列表。

例如,如果我尝试:

len(name) 

我得到的答案“12”(名称中的字母),而这“3”,我想。

任何帮助将是伟大的,谢谢。

+0

这是因为'name'是一个字符串。您可能想要获取与该变量名称关联的对象,可能使用'eval',这是不推荐的 – inspectorG4dget

+2

我上次查找时发现了11个独立的dups,并且每个人都链接到其他几个人...... – abarnert

回答

2

什么你想要做的是几乎总是一个坏主意。如果你只是创建的,而不是一堆独立变量的字典,这是微不足道的:

lists = {} 
lists[('123', '456')] = [1, 2, 3] 
# ... 

现在,而不是这样的:

name = 'list_{0}_{1}' .format(filename[0:3],filename[6:9]) 

...你可以这样做:

name = lists[(filename[0:3], filename[6:9])] 

你当然可以将字典关键字关闭'list_123_456'而不是('123', '456'),或使用两级嵌套字典,所以你可以写lists[filename[0:3]][filename[6:9]] ......无论你发现什么可读。


如果你真的,真的无论如何要做到这一点,你可以查找一个变量名,如果你知道你要在评估它的范围,以获得其价值,因为globals()locals()MyClass.__dict__等。总是可以访问的,而且它们是字典。所以:

name_name = 'list_{0}_{1}' .format(filename[0:3],filename[6:9]) 
name = globals()[name_name] 

如果最坏的情况出现,你甚至可以eval(name_name)。但这是一个更糟的想法。


请参阅this blog post了解更多详情。

1

您可以按名称使用locals()词典让你列表:

>>> list_123_456 = [1,2,3] 
>>> locals()['list_123_456'] 
[1, 2, 3] 

但是,这是不是一个好的做法。相反,考虑制定字典,映射列表的名称与实际名单:

>>> data = {'list_123_456': list_123_456} 
>>> data['list_123_456'] 
[1, 2, 3] 
1

但代码把它当作一个字符串,而不是因为我在一开始定义的列表。

这是因为它是一个字符串。字符串不能与变量互换(因为它们通常被称为,尽管“名称”也是一个很好的术语)。

在一般情况下,如果你想使用计算机名称(即一个字符串)来查找一个数据,你应该把它存放在dict

byname = {'list_123_456':[1,2,3]} 
byname[name] #=> [1,2,3] 
相关问题