Python 使用字典的变量名?

Python 使用字典的变量名?,python,dictionary,nested-lists,Python,Dictionary,Nested Lists,这里是Python初学者。关于词典的问题 我的输入是一个可变长度的列表(例如a=['eggs'、'ham'、'bacon'…]),它的功能是在导入的CSV文件上使用搜索词的列表 我定义了四个函数,将每个术语与所述CSV文件中的不同值相匹配。因此,每个输入项将产生四个结果列表 我希望将输入术语作为键存储在字典中(足够简单),并将生成的四个列表作为值(也足够简单) 然而,由于输入列表长度可变,我想设置一个函数来定义和命名字典“term1”、“term2”,如下所示: term1 = { 'eggs'

这里是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)是否在全球范围内提供?如果是,怎么做?非常感谢所有的帮助。

我不推荐这种方法,但您可以通过字典访问本地和全局名称空间;e、 g.您可以使用熟悉的dict接口向这些名称空间添加任意变量:

>>> globals()['foo'] = 'bar'
>>> foo
'bar'
>>> locals()['spam'] = 'eggs'
>>> spam
'eggs'
不过,您将遇到命名冲突。另外,您的其余代码如何知道哪些全局变量包含您的结果?他们也必须做间接查找


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

您可以尝试以下方法:

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

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

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为我节省了繁琐且重复的“如果关键字不在summarydict中:添加新条目…”开销,因此我的代码保持相当干净。

为什么不定义一个包含所有数据的字典?操作它和访问它的值会容易得多。您的示例不是有效的Python。您有一个具有多个值的键,这是一个
SyntaxError:invalid syntax
@Joe不,不是。您是否遗漏了值上的外括号?它们都是一个列表。我可以将代码粘贴到解释器中(前提是我定义了list1..list4),Python可以很好地解析代码。当@Joe发布时,[list1]等列表本身并没有包含在列表中,后面添加了外括号。(保留编辑历史记录,点击上面“编辑”一词后的链接。)为什么投-1票?我确实说过,如果OP能帮上忙的话,他们真的不想这么做。这不是我的反对票,但我会质疑一个以“不是我推荐的方法…”开头的答案的有用性(甚至是实用性)——那么为什么要首先发帖呢?特别是由于OP的情况与您所描述的方法不符。禁止修改locals()@gnibbler:“不应修改此词典的内容”并不意味着“禁止”。当然,这不是一个好主意。为什么你会给出非常糟糕的建议,而不期望得到否决票?如果每个函数都读取CSV文件,那么该文件将被处理
(键数)X(函数数)
次。有时这是没有帮助的,但通常有一种正交方法,只读取CSV文件一次,并在执行过程中更新结果dict中的值。这在现阶段对我来说有点先进,但我设法调整了您的技术并使其发挥作用。谢谢你的帮助。