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”。

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

4

3 回答 3

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)。但这是一个更糟糕的主意。


有关更多详细信息,请参阅此博客文章

于 2013-08-27T19:19:55.790 回答
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]
于 2013-08-27T19:16:08.267 回答
1

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

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

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

byname = {'list_123_456':[1,2,3]}
byname[name] #=> [1,2,3]
于 2013-08-27T19:17:50.523 回答