2017-08-12 100 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))