字典中的变量名?

3 投票
3 回答
16330 浏览
提问于 2025-04-16 18:23

我是一名Python初学者,想问一下关于字典的问题。

我的输入是一个可变长度的列表(比如 a = ['鸡蛋', '火腿', '培根'...]),这个列表用来作为在导入的CSV文件中搜索的关键词。

我已经定义了四个函数,每个函数会把每个关键词和CSV文件中的不同值进行匹配。因此,每个输入的关键词都会生成四个结果列表。

我想把这些输入的关键词作为字典中的键(这很简单),而生成的四个结果列表作为值(这也很简单)。

不过,由于输入的列表长度不固定,我想设置一个函数来定义并命名这些字典为'term1'、'term2',简单来说就是这样:

term1 = { 'eggs' : [[list1] , [list2] , [list3] , [list4]] }
term2 = { 'ham' : [[list1] , [list2] , [list3] , [list4]] }
term3 = { 'bacon' : [[list1] , [list2] , [list3] , [list4]] }

请问有没有办法像这样命名字典?还有,怎么让它们在全局范围内都能使用?如果可以的话,怎么做呢?非常感谢任何帮助。

3 个回答

2

你可以试试这样做:

results = {}
for name in ['eggs', 'ham', 'bacon']:
   results[name] = (function1(name), function2(name), function3(name), function4(name),)

这里的functionX是你自己定义的函数,它们会从CSV文件或者其他地方返回listX的结果。

在结果字典中,你会看到类似这样的内容:

results = { 
   'eggs' : (egg_list1, egg_list2, egg_list3, egg_list4), 
   'ham' : (ham_list1, ham_list2, ham_list3, ham_list4),
   'bacon' : (bacon_list1, bacon_list2, bacon_list3, bacon_list4),
}
2

这里是你如何预先初始化一个包含所有数据的字典的方法:

a = "eggs bacon ham".split()
summary = dict((key,([],[],[],[])) for key in a)

for lineno,line in enumerate(csv_file):
    # first element in the line is assumed to be the key ("eggs", "bacon", etc.)
    key = line[0]
    # update the data values for this key
    summary[key][0].append(lineno)
    summary[key][1].append(something_else)
    # ... etc.

不过,我觉得这种通过索引访问的方式有点脆弱,我更喜欢用键或者属性来访问。你硬编码的四个列表,可能用字典或者一些简单的数据统计类的对象来表示会更好。

而且,我觉得你的“鸡蛋”、“培根”和“火腿”列表会随着时间的推移而增长,因为你会在CSV文件中找到“煎饼”、“华夫饼”、“土豆饼”等条目。最近我越来越多地使用defaultdict来统计数据,当我处理数据文件或数据库表时,它特别方便。与其提前定义我期望得到的键(还得在输入数据添加新值时手动更新列表),defaultdict会自动添加我定义的格式的新条目:

class Tally(object):
    def __init__(self):
        self.count = 0
        self.lines = []
        self.values = []

from collections import defaultdict
summary = defaultdict(Tally)

for lineno,line in enumerate(csv_file):
    # first element in the line is assumed to be the key ("eggs", "bacon", etc.)
    key = line[0]
    # update the data values for this key
    summary[key].count += 1
    summary[key].lines.append(lineno)
    summary[key].values.append(line[1])
    # ... etc.

defaultdict让我省去了繁琐和重复的“如果键不在summarydict中:添加新条目...”的麻烦,这样我的代码保持得比较简洁。

4

这不是我推荐的方法,但你可以把本地和全局的命名空间当作字典来使用;比如,你可以用字典的方式往这些命名空间里添加任意变量:

>>> globals()['foo'] = 'bar'
>>> foo
'bar'
>>> locals()['spam'] = 'eggs'
>>> spam
'eggs'

不过,你会遇到命名冲突的问题。而且,你的其他代码怎么知道全局变量里存的结果是什么呢?它们也得间接查找!

你最好只用一个字典来保存你的结果,让这个字典作为命名空间,而不是使用全局命名空间。

撰写回答