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

问题描述 投票:2回答:1

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

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

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

好的,所以我知道XY是这里的主要关键。但我想通过这两本词典来查找价值观。假设有DurationX列和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')])}
python python-3.x dictionary
1个回答
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')也是一个函数参数,你可以稍微修改一下这个函数(其中任何一个),如下所示:

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
© www.soinside.com 2019 - 2024. All rights reserved.