需要为存储在变量中的字典名称赋值(Python)
我有两个问题,跟下面的代码有关:
data = csv.DictReader(open('dc_sample.csv'), delimiter=',')
device_names = ['dev1', 'dev2', 'dev3'] #
for row in data:
for word in device_names: #
name = word + '_data' # To create dictionaries with variable names (eg. dev1_data)
vars()[name] = {} #
if word == row['Device']:
vars()[name] = vars()[name].update(row) ###
################ OR #################
word + 'data' = word + 'data'.update(row) ##
1) “data”是一个通过csv模块创建的对象,它是从csv文件中读取的。“data”是字典的形式,但有多行数据。我想创建类似的多个字典,这些字典包含与“data”相同设备名称的其他键和值。
比如说,对于设备名为dev1的情况,我想创建一个包含所有其他键值对的字典(这个字典叫做dev1_data)。
2) 另外,请告诉我,如何修改一个字典或列表,而这个字典或列表的变量名是存储在另一个变量中的。
例如,name = word + 'data'
请告诉我,我的理解哪里有误,以及如何修正代码。
期待您的回复.. 提前谢谢您
2 个回答
0
我会使用嵌套字典,而不是一堆不同名字的字典,下面是问题2的例子:
adict = {'a': 1, 'b':2}
whichdict = 'adict'
eval(whichdict)['b'] = 3
print(adict) #{'a': 1, 'b': 3}
关于问题1:
newname = 'foo_data'
exec(newname + '= {}')
print(foo_data) #empty dict
可以查看关于 eval 和 exec 的文档。使用全局变量和局部变量(在eval的同一页面上有说明)可能稍微好一点。不过,我觉得这些方法都不是特别符合Python的风格,嵌套字典可能会更好一些。
1
像 word + 'data' = ...
这样的写法是行不通的。其实你根本不需要这样做。你为什么想要“用变量名来创建字典”呢?你只需要直接使用字典就可以了:
output = {}
for row in data:
for word in device_names:
name = word + '_data' # To create dictionaries with variable names (eg. dev1_data)
output[name] = {}
if word == row['Device']:
output[name] = output[name].update(row) ###
不过看起来这段代码不太好用,因为它在做 output[name] = {}
的操作太频繁了。
也许你想要的是这样的:
output = {dev_name+ '_data' : {} for dev_name in device_names}
for row in data:
dev_name = row['Device']
if dev_name in device_names:
output[dev_name+ '_data'].update(row)