Python:使用检索到的字符串名称创建变量

时间:2014-08-14 17:40:50

标签: python string variables

这可能是令人费解/不安全的,但如果有人可以告诉我是否有办法在Python中执行以下操作,我会很感激。

1)使用字符串列表(以下称为alpha列表),我想创建以字符串命名的其他列表变量。

2)我希望能够操纵(但主要是附加值)这些新的列表变量而不显式调用它们,即使用alpha列表索引调用它们以便我可以运行它们通过循环。

在下面我提供的代码可以更清楚地传达我想要做的事情。

#1
alphaString = ['a', 'b', 'c', 'd', 'e']
for letter in alphaString:
    letter = []

#2
rowOfValues = ["alpha", "bravo", "charlie", "delta", "echo"] 
#Length of rowOfValues supposed to be same length as alphaString
#There would be many rows being run through a bigger loop that includes this code, but I'll keep it to just this one row for simplicity

for i in range (0, len(alphaString)):
    if rowOfValues[i] not in alphaString[i]: #Ex. if "alpha" not in list a
            alphaString[i].append(rowOfValues[i]) #Ex.  a.append("alpha")

我试图用Python做不到的事情,还是我只是以错误的方式去做?谢谢!

3 个答案:

答案 0 :(得分:1)

可以在Python中通过修改包含本地或全局变量dictlocals()的{​​{1}}来做到这一点。但是,操纵这些结构被认为是危险的,在某些情况下,它可能无法像程序员(或后来阅读代码的人)所期望的那样工作。

通常,当程序需要将特定字符串名称与某个值相关联时,正确的Python数据结构是globals(),它使用字符串值作为键。在你的情况下,它可能看起来像这样:

dict

最后,letter_dict = {} alphaString = ['a', 'b', 'c', 'd', 'e'] for letter in alphaString: letter_dict[letter] = [] rowOfValues = ["alpha", "bravo", "charlie", "delta", "echo"] #Length of rowOfValues supposed to be same length as alphaString #There would be many rows being run through a bigger loop that includes this code, but I'll keep it to just this one row for simplicity for i in range (0, len(alphaString)): if rowOfValues[i] not in letter_dict[alphaString[i]]: #Ex. if "alpha" not in list a letter_dict[alphaString[i]].append(rowOfValues[i]) #Ex. a.append("alpha") 会有以下条目:

letter_dict

例如,使用字典理解,还有更清晰的方法来编写示例中的代码。如果您需要引用已关联的整个名称集,您只需从字典中请求密钥列表:{'a': ['alpha'], 'b': ['bravo'], ...}

Python标准库letter_dict.keys()也有一种称为collections的特殊dict。这种数据结构接受一个函数,只要在字典中找不到特定的键,就可以调用该函数。如果您选择使用该结构,则可以像以下那样明确地初始化空列表:

defaultdict

然后你可以跳过from collections import defaultdict # Make an empty dict where, if a key is requested and not found, an empty list # will be stored for that key as the default. letter_dict = defaultdict(lambda: []) 的循环。

答案 1 :(得分:0)

所以它应该是可能的,只需要一些时间来弄清楚如何去做(用dicts和eval可能吗?),但它会很乱并且不安全。

这是一个简单的oneliner(我认为)完成这项工作(我还不完全确定你想要什么)。

dict(zip(alphaString,map(lambda x: [x],rowOfValues)))

但是,这并不会使值唯一。但是有些玩for循环,set和lambda不应该成为问题。

答案 2 :(得分:-1)

确实,@ EMS建议的字典结构可能是最合适的。但是,您可以使用exec命令使用字符串动态创建变量。例如,如果您希望从字符串中设置= 3,则可以执行此操作。

exec('a=3')

在您的情况下,您可能想尝试

nameList = ['a','b','c','d','e']
varList = []
for name in nameList:
    exec(name+'=[]') 
    exec('varList.append('+name+')')

等...