【问题标题】:Length of list returns length of list name列表长度返回列表名称的长度
【发布时间】:2018-01-20 17:39:02
【问题描述】:
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

如何让它返回列表的长度而不是列表名称的长度?

【问题讨论】:

标签: python-3.x


【解决方案1】:

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

试试这个;

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))

【讨论】:

  • 我只是以这些列表为例,我在每个列表中都有更多的项目
  • 您可以根据需要附加到列表中。如果您想按照问题所示进行操作,请查看更新后的答案。
【解决方案2】:

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

如果您想通过名称访问列表:

正如其他答案和评论所述,您可以先使用eval

您还可以使用locals()(或者如果您的列表在全局范围内,则可能是globals())(取决于您当前的范围)字典来避免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))

【讨论】:

    猜你喜欢
    • 2019-04-08
    • 2017-06-23
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多