【问题标题】:How to select a variable from a string containing its name?如何从包含其名称的字符串中选择一个变量?
【发布时间】:2019-05-28 09:08:52
【问题描述】:

所以我试图获得一个循环函数来自动识别下一个列表以附加一个数字。以下示例代码总结了我想要实现的目标。

start = 'patch'
end = 'List'

patch1List = []; patch2List = []; patch3List = []; patch4List = []; patch5List = []; patch6List = []
patch7List = []; patch8List = []; patch9List = []; patch10List = []

for patch in range(10):
    num = patch+1
    DataPoint = random.randint(1,10)

    currentPList = ('%s%d%s' % (start,num,end))
    currentPList.append(DataPoint)

我需要循环将一个数据点附加到 10 个空列表中的每一个中。

我尝试通过设置currentPList 来识别要使用的列表来做到这一点。问题是,我不太确定如何将当前为字符串的currentPList 转换为正确的对象(即空的patchLists 之一)。我该怎么做?

【问题讨论】:

  • 标题具有误导性。字符串是对象。你要找的词是variable names
  • patch1List, patch2List, patch3List, ... 看起来您想使用列表而不是 10 个单个变量。
  • 嗨克劳斯,对不起,如果代码看起来有点欺骗性。这是我试图在更大范围内做的事情的简化代码。基本上,在每个patchLists中,它们都会有数百个数据点,每个列表由不同的数据点组成。因此,我把它布置成这样。
  • 您仍然需要使用列表。只需一个包含 10 个子列表的列表

标签: python string python-2.7


【解决方案1】:

你肯定把这件事复杂化了。只需使用列表列表:

>>> import random
>>> num_arrays = 10
>>> array = [ [random.randint(1,10)] for i in range(num_arrays) ]
>>> array
[[2], [1], [10], [6], [9], [2], [2], [5], [8], [4]]

通过这种方式,您可以获得每个单独列表的相同功能并使其具有可扩展性,而不是尝试通过连接字符串来引用变量作为其名称。

【讨论】:

  • 为什么不只用array = [ [random.randint(1,10)] for i in range(num_arrays)] 做单线?
  • 呃! @Jean-FrançoisFabre 你是绝对正确的,我只是忽略了:/。我会根据您的建议更新答案。
【解决方案2】:

@Charles Drotar 的答案是您想要做的,但是由于标题说明了如何将字符串转换为变量名,因此您可以实际创建指定为字符串的变量(但在您的情况下不要这样做) :

s = 'string'
for i in range(1,6):
    vars().update({s + str(i): i})

>>> string2
2
>>> string5
5

您在这里所做的是将变量条目添加到命名空间。在没有对象参数的情况下,vars() 的行为类似于 locals()

【讨论】:

  • 值得注意的是python文档explicitly state那个locals不应该被修改。
【解决方案3】:

我认为 Pythonic 的方法是将所有补丁列表存储在一个字典中。这样,您可以通过为每个人创建一个唯一的字典键来轻松选择哪一个。还要注意,使用这种方法生成的键甚至不需要是有效的 Python 标识符——而且很容易改变有多少,因为它都是动态完成的。

这就是我的意思(注意我还在PEP 8 Naming Conventions之后使用了变量名):

from collections import defaultdict
import random

START, END = 'patch', 'List'
patches = defaultdict(list)  # A dictionary whose values default to lists.

for patch_num in range(1, 11):
    data_point = random.randint(1, 10)
    current_patch_list = ('%s%d%s' % (START, patch_num, END))  # Create key.
    patches[current_patch_list].append(data_point)

print(dict(patches))

示例输出:

{'patch1List': [5], 'patch2List': [8], 'patch3List': [4], 'patch4List': [9], 'patch5List': [10], 'patch6List': [9], 'patch7List': [5], 'patch8List': [9], 'patch9List': [8], 'patch10List': [7]}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-25
    • 2012-11-21
    • 2015-07-16
    • 2022-08-17
    • 2022-01-12
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多