我有一个名称列表:
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'。
任何帮助都会很棒,谢谢。
答案 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]