3

Python初学者在这里。关于字典的问题。

我的输入是一个可变长度列表(例如 a = ['eggs', 'ham', 'bacon'...] ),它用作要在导入的 CSV 文件上使用的搜索词列表。

我已经定义了四个函数,它们将每个术语与所述 CSV 文件中的各种值相匹配。因此,每个输入项将产生四个结果列表。

我想将输入项存储为字典中的键(很简单),并将生成的四个列表存储为值(也很简单)。

然而,因为输入列表是可变长度的,我想设置一个函数来定义和命名字典'term1','term2',非常基本的说明如下:

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

有没有一种方法可以像这样命名字典?b) 并让它们在全球范围内可用?如果是这样,怎么做?非常感谢任何和所有帮助。

4

3 回答 3

3

不是我推荐的方法,但您可以将本地和全局命名空间作为字典访问;例如,您可以使用熟悉的 dict 接口向这些命名空间添加任意变量:

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

但是,您遇到命名冲突。此外,您的其余代码如何知道哪些全局变量包含您的结果?他们也必须进行间接查找!

你最好只使用一个包含你的结果的字典,让它成为命名空间而不是全局命名空间。

于 2011-05-26T11:46:10.023 回答
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.

我发现这种索引访问有点脆弱,但更喜欢键控或属性访问。您的 4 个列表的硬编码列表可能更好地表示为 dict 甚至是一些简单的数据统计类的对象。

此外,我认为您的“鸡蛋”、“培根”和“火腿”列表会随着时间的推移而增长,因为您会在 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 为我节省了繁琐且重复的“如果 key 不在 summarydict 中:添加新条目...”开销,因此我的代码保持相当干净。

于 2011-05-26T12:03:25.907 回答
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),
}
于 2011-05-26T11:51:50.557 回答