这可能是令人费解/不安全的,但如果有人可以告诉我是否有办法在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做不到的事情,还是我只是以错误的方式去做?谢谢!
答案 0 :(得分:1)
你可以在Python中通过修改包含本地或全局变量dict
和locals()
的{{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+')')
等...