字符串未识别为列表名称

时间:2013-08-27 19:14:16

标签: python list

我有一个名称列表:

list_123_456 = [1,2,3]

然后我使用文件名的某些部分来重新创建此列表的名称:

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

这就是'name'现在等于'list_123_456'的程度,正如我所希望的那样。但是代码将它视为字符串而不是我在开头定义的列表。

例如,如果我尝试:

len(name)

我得到答案'12'(名字中的字母)而不是我想要的'3'。

任何帮助都会很棒,谢谢。

3 个答案:

答案 0 :(得分: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 :(得分: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]

答案 2 :(得分:1)

  

但是代码将它视为字符串而不是我在开头定义的列表。

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

通常,如果要使用计算名称(即字符串)查找一段数据,则应将其存储在dict

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