我这里有一个父词典,它是两个词典X
和Y
的集合。使用csv模块的DictReader
存储它们。
让我们称这个字典example_dicto
包含两个有序的词典。为了澄清,来自Spyder的变量资源管理器,它看起来像:
Name Type Size Value
example_dict dict 2 {'X':OrderedDict, 'Y': OrderedDict}
好的,所以我知道X
和Y
是这里的主要关键。但我想通过这两本词典来查找价值观。假设有Duration
的X
列和Duration (min)
的Y
,我希望我的函数根据行读取这些列并返回它们的值。
def info_from_row(row, dictionary):
if dict == 'X':
duration = float(row['Duration'])
else:
duration = float(row['Duration (min)'])
return duration
当我调用info_from_row
时,python返回通常的KeyError,其中回溯告诉我这些“键”都不存在。所以基本上我必须索引一个字典,它是一个字典集合,然后在它们的“主”键X和Y中索引键以返回一个值。我如何索引他们,因为通常的dict['key']
方法给我一个错误,除了'Duration' in X
返回False
。
有关更多说明,这些词典如下所示:
print(example_dict)
{'X': OrderedDict([('ID', '123456'), ('Duration', '54941')]),
'Y': OrderedDict([('ID', '789101'), ('Duration (min)', '7869')])}
我相信你很想知道你想做什么以及如何实现它。假设我正确地理解了你的问题,我就是这样做的:
from collections import OrderedDict
def info_from_row(my_dict):
try:
return float(my_dict['Duration'])
except KeyError:
return float(my_dict['Duration (min)'])
example_dict = {'X': OrderedDict([('ID', '123456'), ('Duration', '54941')]),
'Y': OrderedDict([('ID', '789101'), ('Duration (min)', '7869')])}
print(info_from_row(example_dict['X'])) # -> 54941.0
print(info_from_row(example_dict['Y'])) # -> 7869.0
如您所见,无论您要查询哪个子字典,都会打印持续时间。
不使用try
-except
完全相同的另一种方法是:
def info_from_row(my_dict):
if 'Duration' in my_dict:
return float(my_dict['Duration'])
else:
return float(my_dict['Duration (min)'])
它具有完全相同的结果,并以完全相同的方式调用; info_from_row(example_dict['Y'])
。
如果你想要主要的key
('X'
或'Y'
)也是一个函数参数,你可以稍微修改一下这个函数(其中任何一个),如下所示:
def info_from_row(my_dict, main_key):
if 'Duration' in my_dict[main_key]:
return float(my_dict[main_key]['Duration'])
else:
return float(my_dict[main_key]['Duration (min)'])
但是那时调用语句也必须修改:
print(info_from_row(example_dict, 'X')) # -> 54941.0
print(info_from_row(example_dict, 'Y')) # -> 7869.0