从存储在一个dict对象中的几个有序词典中提取项目

时间:2017-12-22 13:57:35

标签: python python-3.x dictionary

我这里有一个父词典,它是两个词典XY的集合。使用csv模块的DictReader存储它们。

让我们调用包含两个有序词典的字典example_dicto。为了澄清,来自Spyder的变量资源管理器,这看起来像:

Name         Type  Size  Value
example_dict dict  2     {'X':OrderedDict, 'Y': OrderedDict}

好的,我知道XY是这里的主要关键。但我想通过这两本词典来查找价值观。假设Duration的{​​{1}}列和X的{​​{1}},我希望我的函数根据行读取这些列并返回它们的值。

Duration (min)

当我调用Y时,python返回通常的KeyError,其中回溯告诉我这些'键都没有。存在。 所以基本上我必须索引一个字典集合,这个字典是一个字典集合,然后在它们的主要字典中索引键。键X和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返回dict['key']之外。

有关更多说明,这些词典如下所示:

'Duration' in X

1 个答案:

答案 0 :(得分:2)

我相信你对于你想做什么以及如何实现它感到很困惑。假设我正确地理解了你的问题,我就是这样做的:

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')也是函数参数,您可以稍微修改函数(其中任何一个),如下所示:< / p>

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