Python:在嵌套字典中选择键
我有一个嵌套字典,其结构如下:Python:在嵌套字典中选择键,python,dictionary,nested,Python,Dictionary,Nested,我有一个嵌套字典,其结构如下: topHitsDict = {'record301': {'query': 'OBGP2018240_Oncorhynchus.clarkii', 'hit1': {'description': 'OBGP-2018-240_Oncorhynchus.clarkii', 'score': '340', 'eval': '2e-94'}, 'hit2
topHitsDict =
{'record301':
{'query': 'OBGP2018240_Oncorhynchus.clarkii',
'hit1':
{'description': 'OBGP-2018-240_Oncorhynchus.clarkii',
'score': '340',
'eval': '2e-94'},
'hit2':
{'description': 'OBGP-2017-332_Oncorhynchus.clarkii',
'score': '340',
'eval': '2e-94'},
'numTopHits': 2},
'record302':
{'query': 'OBGP2018248_Oncorhynchus.kisutch',
'hit1':
{'description': 'OBGP-2018-248_Oncorhynchus.kisutch',
'score': '340',
'eval': '2e-94'},
'hit2':
{'description': 'OBGP-2018-038_Oncorhynchus.kisutch',
'score': '340',
'eval': '2e-94'},
'hit3':
{'description': 'OBGP-2017-271_Oncorhynchus.kisutch',
'score': '340',
'eval': '2e-94'},
'numTopHits': 3},
'record303':
{'query': 'OBGP2019056_Oncorhynchus.tshawytscha',
'hit1':
{'description': 'OBGP-2019-056_Oncorhynchus.tshawytscha',
'score': '340',
'eval': '2e-94'},
'hit2':
{'description': 'OBGP-2017-356_Oncorhynchus.tshawytscha',
'score': '340',
'eval': '2e-94'},
'hit3':
{'description': 'OBGP-2017-052_Oncorhynchus.tshawytscha',
'score': '340',
'eval': '2e-94'},
'numTopHits': 3},
'record304':
{'query': 'OBGP2019190_Oncorhynchus.nerka',
'hit1':
{'description': 'OBGP-2019-191_Oncorhynchus.nerka',
'score': '340',
'eval': '2e-94'},
'hit2':
{'description': 'OBGP-2019-190_Oncorhynchus.nerka',
'score': '340',
'eval': '2e-94'},
'numTopHits': 2}
}
我想访问所有hitx子字典中的“描述”键
我知道我可以使用for循环,并且我尝试了以下想法,通过循环使用recordx字典,然后一次性访问recordx字典中hitx字典中的所有“描述”键,我可以将其保持为一个for循环,但我没有取得任何成功:
hits = dict(filter(lambda item: 'hit' in item[0], topHitsDict['record301'].items()))
seqs = dict(filter(lambda item: 'description' in item[0], hits.items()))
seqs
{}
任何和所有的帮助将不胜感激 除非您坚持使用1个循环单独处理每个
记录xxx
键,否则您需要2个循环来完成此操作。而且列表理解比
过滤器
更容易阅读/理解
desc = [
v["description"]
for _, value in topHitsDict.items()
for k, v in value.items()
if "hit" in k
]
除非您坚持使用1个循环分别处理每个
recordxxx
键,否则需要2个循环来完成此操作。和列表理解比
过滤器
更容易阅读/理解
desc = [
v["description"]
for _, value in topHitsDict.items()
for k, v in value.items()
if "hit" in k
]
我想你误解了我的意思。从文档中:
过滤器(函数,可编辑)
:从iterable的那些元素构造一个迭代器,函数为其返回true 所以当你这么做的时候
hits = dict(filter(lambda item: 'hit' in item[0], topHitsDict['record301'].items()))
你基本上在做:
hits = {}
for item in topHitsDict['record301'].items():
if 'hit' in item[0]:
hits[item[0]] = item[1]
它只提供topHitsDict['record301']
中的hit*
键
hits = {'hit1': {'description': 'OBGP-2018-240_Oncorhynchus.clarkii',
'score': '340',
'eval': '2e-94'},
'hit2': {'description': 'OBGP-2017-332_Oncorhynchus.clarkii',
'score': '340',
'eval': '2e-94'}}
相反,你真正想要的是那些hit*
dict的描述。为此,可以使用map
,然后将迭代器转换为列表
descriptions = list(map(lambda item: item[1]['description'], hits.items())
# descriptions: ['OBGP-2018-240_Oncorhynchus.clarkii', 'OBGP-2017-332_Oncorhynchus.clarkii']
这相当于:
descriptions = []
for item in hits.items():
descriptions.append(item[1]['description'])
如果您想对topHitsDict
的所有键执行此操作,则必须对其进行一些更改。使用循环:
all_descriptions = []
for recordVal in topHitsDict.values():
hits = dict(filter(lambda item: 'hit' in item[0], recordVal.items()))
descriptions = list(map(lambda item: item[1]['description'], hits.items())
# Add to all_descriptions
all_descriptions = all_descriptions + descriptions
首先把它们写成循环几乎总是比较容易的。然后,您可以将它们作为列表或听写理解编写,然后使用filter()
和map()
或者作为一种理解:
all_descriptions = [hitval["description"] for record in topHitsDict.values() for hitname, hitval in record.items() if "hit" in hitname]
我想你误解了我的意思。从文档中:
过滤器(函数,可编辑)
:从iterable的那些元素构造一个迭代器,函数为其返回true 所以当你这么做的时候
hits = dict(filter(lambda item: 'hit' in item[0], topHitsDict['record301'].items()))
你基本上在做:
hits = {}
for item in topHitsDict['record301'].items():
if 'hit' in item[0]:
hits[item[0]] = item[1]
它只提供topHitsDict['record301']
中的hit*
键
hits = {'hit1': {'description': 'OBGP-2018-240_Oncorhynchus.clarkii',
'score': '340',
'eval': '2e-94'},
'hit2': {'description': 'OBGP-2017-332_Oncorhynchus.clarkii',
'score': '340',
'eval': '2e-94'}}
相反,你真正想要的是那些hit*
dict的描述。为此,可以使用map
,然后将迭代器转换为列表
descriptions = list(map(lambda item: item[1]['description'], hits.items())
# descriptions: ['OBGP-2018-240_Oncorhynchus.clarkii', 'OBGP-2017-332_Oncorhynchus.clarkii']
这相当于:
descriptions = []
for item in hits.items():
descriptions.append(item[1]['description'])
如果您想对topHitsDict
的所有键执行此操作,则必须对其进行一些更改。使用循环:
all_descriptions = []
for recordVal in topHitsDict.values():
hits = dict(filter(lambda item: 'hit' in item[0], recordVal.items()))
descriptions = list(map(lambda item: item[1]['description'], hits.items())
# Add to all_descriptions
all_descriptions = all_descriptions + descriptions
首先把它们写成循环几乎总是比较容易的。然后,您可以将它们作为列表或听写理解编写,然后使用filter()
和map()
或者作为一种理解:
all_descriptions = [hitval["description"] for record in topHitsDict.values() for hitname, hitval in record.items() if "hit" in hitname]
您需要首先迭代所有记录,然后检查每个记录的值是否为
dict
。如果值为dict,则搜索说明
,并将其附加到列表中:
description = list()
for key,records in topHitsDict.items():
for inner_key, inner_value in records.items():
if type(inner_value) is dict and "description" in inner_value.keys():
description.append(inner_value['description'])
print(description)
您需要首先迭代所有记录,然后检查每个记录的值是否为
dict
。如果值为dict,则搜索说明
,并将其附加到列表中:
description = list()
for key,records in topHitsDict.items():
for inner_key, inner_value in records.items():
if type(inner_value) is dict and "description" in inner_value.keys():
description.append(inner_value['description'])
print(description)
非常感谢你的精彩解释。这对我帮助很大!非常感谢你的精彩解释。这对我帮助很大!