带字典的变量名称?

时间:2011-05-26 11:38:48

标签: python dictionary nested-lists

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)并让它们全球可用?如果是这样,怎么样?非常感谢任何和所有的帮助。

3 个答案:

答案 0 :(得分:3)

您可以尝试这样的事情:

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),
}

答案 1 :(得分:3)

以下是如何预先初始化包含所有数据的字典:

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为我省去了繁琐且重复的“if key not in summarydict:add new entry ...”开销,所以我的代码保持相当干净。

答案 2 :(得分:2)

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

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

会遇到命名冲突。此外,您的其他代码将如何知道全局变量包含您的结果?他们也必须做间接的观察!

最好只使用包含结果的一个字典,然后将其作为命名空间而不是全局命名空间。