需要为存储在变量中的字典名称赋值(Python)

0 投票
2 回答
1345 浏览
提问于 2025-04-16 15:26

我有两个问题,跟下面的代码有关:

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

可以查看关于 evalexec 的文档。使用全局变量和局部变量(在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)

撰写回答