问题描述
|
Python初学者在这里。有关字典的问题。
我的输入是一个可变长度列表(例如a = [\'eggs \',\'ham \',\'bacon \'...]),它用作要在导入的CSV文件上使用的搜索词的列表。
我定义了四个函数,这些函数将每个术语与所述CSV文件中的各种值进行匹配。因此,每个输入项将产生四个结果列表。
我想将输入项作为键存储在字典中(很容易),将得到的四个列表存储为值(也很容易)。
但是,由于输入列表的长度是可变的,因此我想建立一个函数来定义和命名字典\'term1 \',\'term2 \',因此非常简单地说明了这一点:
term1 = { \'eggs\' : [[list1],[list2],[list3],[list4]] }
term2 = { \'ham\' : [[list1],[list4]] }
term3 = { \'bacon\' : [[list1],[list4]] }
是否有a)这样命名字典的方法? b)并且它们在全球范围内可用吗?如果是这样,怎么办?任何和所有帮助非常感谢。
解决方法
我不建议您使用这种方法,但是您可以将本地和全局名称空间作为字典来访问。例如您可以使用熟悉的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文件中找到\“ pancakes \”,\“ waffles \”, \“哈希布朗\”等等。在浏览数据文件或数据库表时,最近越来越多地使用defaultdict来计算数据。无需预定义我希望获得的键(并且当输入数据中添加了新值时必须自己更新列表),defaultdict只是添加了我定义的形式的新条目:
class Tally(object):
def __init__(self):
self.count = 0
self.lines = []
self.values = []
from collections import defaultdict
summary = defaultdict(Tally)
for lineno,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 ... \”开销,因此我的代码保持相当干净。