我有以下结构:
input = {
'clark': {
'elements':['id[3]_element[1]','id[3]_element[2]','id[3]_element[3]'],
'nickname': 'superman',
'registered': 'Y'
},
'rodger': {
'elements':['id[2]_element[1]','id[2]_element[2]','id[2]_element[3]'],
'nickname': 'rodjeuur',
'registered': 'N'
},
'ratman': {
'elements':['id[6]_element[1]','id[6]_element[2]','id[6]_element[3]'],
'nickname': 'rat',
'registered': 'Y'
},
'marylin': {
'elements':['id[90]_element[1]','id[90]_element[2]','id[90]_element[3]'],
'nickname': 'monroe',
'registered': 'Y'
},
'snoopy': {
'elements':['id[1]_element[1]','id[1]_element[2]','id[1]_element[3]'],
'nickname': 'lame',
'registered': 'N'
},
'dummy_field[1]': 'dogfood',
'dummy_field[2]': 'monkeyjump',
'id[3]_element[1]':{
'feature': 'vision glass',
'value': 0.12,
'color': 'blue'
},
'id[3]_element[2]':{
'feature': 'height',
'value': 1.88
},
'id[3]_element[3]':{
'feature': 'cookingskill',
'value': 0
},
'id[6]_element[1]':{
'feature': 'rat teeth',
'value': 25,
'similarity':'luis suarez'
},
'id[6]_element[2]':{
'feature': 'height',
'value': 1.70
},
'id[6]_element[3]':{
'feature': 'cookingskill',
'value': 0.5
},
'id[2]_element[1]':{
'feature': 'tennis raquet',
'value': 500000,
'particularity':'second arm'
},
'id[2]_element[2]':{
'feature': 'height',
'value': 1.78
},
'id[2]_element[3]':{
'feature': 'trickshot',
'value': 120
},
'id[1]_element[1]':{
'feature': 'mood',
'value': 0,
'particularity':'depressed'
},
'id[1]_element[2]':{
'feature': 'height',
'value': 0.45
},
'id[1]_element[3]':{
'feature': 'sadness',
'value': 10000000
},
'id[90]_element[1]':{
'feature': 'charm',
'value': 500000
},
'id[90]_element[2]':{
'feature': 'height',
'value': 1.72
},
'id[90]_element[3]':{
'feature': 'cookingskills',
'value': 0
}
}
以及要迭代的列表:
lnames=['clark','ratman','snoopy','marylin']
我想获得以下词典列表:
output=[{'vision glass':0.12, 'height':1.88, 'cookingskill':0},
{'rat teeth':25, 'height':1.70, 'cookingskill':0.5},
{'mood':0, 'height':0.45, 'sadness':10000000},
{'charm':500000, 'height':1.72, 'cookingskills':0}
]
我开始使用非常基本的代码:
output=[{.... for el in input[name]['elements']} for name in lnames]
我可以访问每个名称元素并迭代它们以访问不同的“功能”和“值”,但我不知道如何将它们分组为给定名称的字典。
有人有想法吗?
修改
现在假设我有相同的输入,除了每个名字的'elements'字段中都有一个'@':
input = {
'clark': {
'elements':['@id[3]_element[1]','@id[3]_element[2]','@id[3]_element[3]'],
'nickname': 'superman',
'registered': 'Y'
},
'rodger': {
'elements':['@id[2]_element[1]','@id[2]_element[2]','@id[2]_element[3]'],
'nickname': 'rodjeuur',
'registered': 'N'
},
'ratman': {
'elements':['@id[6]_element[1]','@id[6]_element[2]','@id[6]_element[3]'],
'nickname': 'rat',
'registered': 'Y'
},
'marylin': {
'elements':['@id[90]_element[1]','@id[90]_element[2]','@id[90]_element[3]'],
'nickname': 'monroe',
'registered': 'Y'
},
'snoopy': {
'elements':['@id[1]_element[1]','@id[1]_element[2]','@id[1]_element[3]'],
'nickname': 'lame',
'registered': 'N'
},
'dummy_field[1]': 'dogfood',
'dummy_field[2]': 'monkeyjump',
'id[3]_element[1]':{
'feature': 'vision glass',
'value': 0.12,
'color': 'blue'
},
'id[3]_element[2]':{
'feature': 'height',
'value': 1.88
},
'id[3]_element[3]':{
'feature': 'cookingskill',
'value': 0
},
'id[6]_element[1]':{
'feature': 'rat teeth',
'value': 25,
'similarity':'luis suarez'
},
'id[6]_element[2]':{
'feature': 'height',
'value': 1.70
},
'id[6]_element[3]':{
'feature': 'cookingskill',
'value': 0.5
},
'id[2]_element[1]':{
'feature': 'tennis raquet',
'value': 500000,
'particularity':'second arm'
},
'id[2]_element[2]':{
'feature': 'height',
'value': 1.78
},
'id[2]_element[3]':{
'feature': 'trickshot',
'value': 120
},
'id[1]_element[1]':{
'feature': 'mood',
'value': 0,
'particularity':'depressed'
},
'id[1]_element[2]':{
'feature': 'height',
'value': 0.45
},
'id[1]_element[3]':{
'feature': 'sadness',
'value': 10000000
},
'id[90]_element[1]':{
'feature': 'charm',
'value': 500000
},
'id[90]_element[2]':{
'feature': 'height',
'value': 1.72
},
'id[90]_element[3]':{
'feature': 'cookingskills',
'value': 0
}
}
使用以下代码:
import re
def at(x):
return input[re.sub(r'@','',x)]
我相信我可以像这样继续字典理解:
output=[{at(el)['feature']:at(el)['value'] for el in input[name]['elements']} for name in lnames]
但我得到了错误NameError: global name 'at' is not defined
。当我使用列表理解而不是字典理解时,它可以工作,但是:
1 - 我仍然想知道这个名称错误意味着什么,因为它与字典理解相关联。 2 - 这不是预期的结果。
与初始答案相比,编辑并不复杂,但是第1点/真的让我很烦恼!
答案 0 :(得分:3)
你快到了。它应该是:
output=[{input[el]['feature']:input[el]['value']
for el in input[name]['elements']} for name in lnames]
答案 1 :(得分:1)
存在检查的综合解决方案
output = [
{
input[element]['feature'] : input[element]['value']
for element in input.get(name,{}).get('elements',[])
}
for name in lnames
]
答案 2 :(得分:0)
有时写出常规循环有助于转换为列表理解。完成后,我得到了以下代码:
output = [{input[element]['feature']: input[element]['value']
for element in input[name]['elements']}
for name in lnames]