2011-05-26 90 views
2

Python初学者在这里。关于字典的问题。字典变量名?

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

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

我想将输入条款作为关键字存储在字典中(非常简单)并将结果四个列表作为值存储(也很简单)。

然而,因为输入列表的长度是可变的,我想建立一个功能,“TERM2”来定义和命名的字典“TERM1”,示出非常基本上从而:

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

是否有a)这样命名字典的方法?和b)并让它们全球可用?如果是这样,怎么样?任何和所有的帮助非常感谢。

+7

为什么你不定义一个包含所有数据的字典呢?它将更容易操纵它并访问它的值 – eumiro 2011-05-26 11:41:24

+0

你的示例是无效的Python。你有一个具有多个值的键,这是一个'SyntaxError:invalid syntax'。 – 2011-05-26 11:48:17

+0

@Joe不,它是不是错过了值的外括号?它们都是列表的列表。我可以粘贴将代码放到解释器中(提供的是我定义的list1..list4),Python解析它就好了。 – 2011-05-26 12:04:23

回答

2

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

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

碰上命名冲突,但。另外,你的代码的其余部分如何知道全局变量包含你的结果?他们也必须做间接查找!

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

+0

为什么-1票?我确实说如果他们可以帮助它OP真的不想这样做。 – 2011-05-26 12:00:15

+1

Downvote工具提示显示“此答案无用”。这不是我的失望,但我会质疑以“不是我推荐的方法......”开头的答案的有用性(或甚至实用性) - 为什么要先放在首位呢?尤其是因为OP的情况并不在可能需要您描述的方法的边缘情况附近。 – PaulMcG 2011-05-26 12:09:09

+1

修改当地人()被禁止http://docs.python.org/library/functions.html#locals – 2011-05-26 12:54:03

3

你可以尝试这样的事情:

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

其中functionX是你的职责将从CSV文件或任何返回LISTX结果。

在这里,您将有结果dictionnary是这样的:

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

如果每个函数都读取CSV文件,那么这个文件将被处理'(键数)×(函数数)'次。有时候这不会得到帮助,但通常有一种正交方式只读取一次CSV文件,并在结果字典中更新值。 – PaulMcG 2011-05-26 12:23:59

+0

这工作得很好。谢谢您的帮助。 – Dingo 2011-05-27 06:56:20

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列表的硬编码列表可以更好地表示为一个字典,或者甚至是一些简单数据统计类的对象。当您在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为我节省了繁琐和重复的“如果关键不在总结:添加新条目...“开销,所以我的代码保持相当干净

+0

在这个阶段,这对我来说有点高级,但我设法调整了你的技巧并使其运作起来。谢谢您的帮助。 – Dingo 2011-05-27 06:55:28