2017-08-12 79 views
0
Import random 

set_list_1 = ["one"] 
set_list_2 = ["two"] 

number = random.choice(range(1, 3)) 

chosen_list = "set_list_" + str(number) 

print(len(chosen_list)) 

返回10,而不是1返回列表名称的长度

我如何得到它返回列表,而不是名单名称的长度的长度?

+1

在这里你去:https://docs.python.org/2/library/ functions.html#eval :) – Jacquot

回答

0

这是一个坏主意。你应该使用列表。

试试这个;

Import random 

set_list = [[], ["one"], ["two"]] 
number = random.choice(range(1, 3)) 

chosen_list = set_list[number] 
print(len(chosen_list)) 

如果您绝对想要动态访问变量,

Import random 

set_list_1 = ["one"] 
set_list_2 = ["two"] 

number = random.choice(range(1, 3)) 

chosen_list = eval("set_list_" + str(number)) 
print(len(chosen_list)) 
+0

我只是使用这些列表作为例子,我在每个列表中有更多的项目 – qwiqwiqwiqwiqwi

+0

您可以追加到列表中尽可能多的,你想要的。如果您想按问题中所示执行操作,请检查更新后的答案。 –

0

要回答这个问题本身,chosen_list不是列表,而是一个字符串。那么len()返回一个字符串的长度,也就是说,它的字符数。

如果要通过它的名称访问列表,而不是:

如前所述通过对方的回答和评论,你可以先使用eval这一点。

您还可以使用locals()(或者globals()如果你的列表是在全球范围内)(根据您当前的范围内)dictionnary避免eval。这些函数返回一个包含您可以在全局(以及模块范围准确)/本地范围内访问的所有内容的字典。

import random 

set_list_1 = ["one"] 
set_list_2 = ["two"] 

number = random.choice(range(1, 3)) 
chosen_list = locals()["set_list_" + str(number)] 
print(len(chosen_list)) 

它可能比eval更快更安全。

或者,您可以在dict中注册您的列表,将变量名称映射到̀list。举例来说,你可以做这样的事情:

import random 
registry = {} 

registry["set_list_1"] = ["one"] 
registry["set_list_2"] = ["two"] 
number = random.choice(range(1, 3)) 
chosen_list = registry["set_list_" + str(number)] 
print(len(chosen_list)) 

这是毫无疑问的,甚至快于使用locals(),实际上是Python中常见的模式。 Here is a classic example of this, involving metaclasses.

此外,你可以做到这一点,如果你不真正需要的变量名,因为任何其他原因:

import random 
registry = [] 

registry.append(["one"]) 
registry.append(["two"]) 
chosen_list = random.choice(registry) 
print(len(chosen_list)) 
相关问题