[英]Loop through list of nested dictionaries
我有一系列的字典,如下所示:
test = [
{
'name': '30 d',
'description': [
{'label': 'fuel_type', 'value': 'DIESEL'},
{'label': 'displacement[cc]', 'value': '2993'},
{'label': 'power[hp]', 'value': '208'},
{'label': 'power[PS]', 'value': '211'},
{'label': 'power[kW]', 'value': '155'}
],
'href': 'http://ws.indicata.com/cherry-rs/api/vivi/BE?body=4954&category=PASSENGER&model=24&engine=9434®date=2017&make=39&facelift=1569', 'type': 'application/json', 'rel': 'engine'
},
{
'name': '30 c',
'description': [
{'label': 'fuel_type', 'value': 'DIESEL'},
{'label': 'displacement[cc]', 'value': '2993'},
{'label': 'power[hp]', 'value': '255'},
{'label': 'power[PS]', 'value': '258'},
{'label': 'power[kW]', 'value': '190'}
],
'href': 'http://ws.indicata.com/cherry-rs/api/vivi/BE?body=4954&category=PASSENGER&model=24&engine=7975®date=2017&make=39&facelift=1569', 'type': 'application/json', 'rel': 'engine'
},
{
'name': '35 i',
'description': [
{'label': 'fuel_type', 'value': 'PETROL'},
{'label': 'displacement[cc]', 'value': '2979'},
{'label': 'power[hp]', 'value': '302'},
{'label': 'power[PS]', 'value': '306'},
{'label': 'power[kW]', 'value': '225'}
],
'href': 'http://ws.indicata.com/cherry-rs/api/vivi/BE?body=4954&category=PASSENGER&model=24&engine=7977®date=2017&make=39&facelift=1569', 'type': 'application/json', 'rel': 'engine'
}
]
我想遍历它,我想得到类似的东西:
Diesel
30 d 155kw 2993cc 211
30 c 190kw 2993cc 258
Petrol
35 i 225kw 2979cc 306
知道我该怎么做吗?
我是python的新手,因此欢迎您提供任何帮助。
在不知道您想要结果为哪种数据/集合类型的情况下,以下内容将打印您想要的结果。
from collections import OrderedDict
engines = OrderedDict()
engines['DIESEL'] = []
engines['PETROL'] = []
for engine in test:
eng_type = engine['description'][0]['value']
name = engine['name']
disp = engine['description'][1]['value']
ps = engine['description'][3]['value']
kw = engine['description'][4]['value']
engines[eng_type].append([name, kw, disp, ps])
for engine_type, engine_list in engines.items():
print(engine_type)
for engine_vals in engine_list:
print('{}\t{}kw\t{}cc\t{}'.format(*engine_vals))
print()
输出:
DIESEL
30 d 155kw 2993cc 211
30 c 190kw 2993cc 258
PETROL
35 i 225kw 2979cc 306
第一步是遍历初始列表中的每个项目。 看起来每个项目都可以视为一辆汽车。 然后,您只需要提取您感兴趣的所有信息。由于您希望将car_type打印为标题,因此请使用字典存储该信息,其中的键为car_type,值为包含该信息的列表适用于属于该类型汽车的所有汽车。
test = [
{
'name': '30 d',
'description': [
{'label': 'fuel_type', 'value': 'DIESEL'},
{'label': 'displacement[cc]', 'value': '2993'},
{'label': 'power[hp]', 'value': '208'},
{'label': 'power[PS]', 'value': '211'},
{'label': 'power[kW]', 'value': '155'}
],
'href': 'http://ws.indicata.com/cherry-rs/api/vivi/BE?body=4954&category=PASSENGER&model=24&engine=9434®date=2017&make=39&facelift=1569', 'type': 'application/json', 'rel': 'engine'
},
{
'name': '30 c',
'description': [
{'label': 'fuel_type', 'value': 'DIESEL'},
{'label': 'displacement[cc]', 'value': '2993'},
{'label': 'power[hp]', 'value': '255'},
{'label': 'power[PS]', 'value': '258'},
{'label': 'power[kW]', 'value': '190'}
],
'href': 'http://ws.indicata.com/cherry-rs/api/vivi/BE?body=4954&category=PASSENGER&model=24&engine=7975®date=2017&make=39&facelift=1569', 'type': 'application/json', 'rel': 'engine'
},
{
'name': '35 i',
'description': [
{'label': 'fuel_type', 'value': 'PETROL'},
{'label': 'displacement[cc]', 'value': '2979'},
{'label': 'power[hp]', 'value': '302'},
{'label': 'power[PS]', 'value': '306'},
{'label': 'power[kW]', 'value': '225'}
],
'href': 'http://ws.indicata.com/cherry-rs/api/vivi/BE?body=4954&category=PASSENGER&model=24&engine=7977®date=2017&make=39&facelift=1569', 'type': 'application/json', 'rel': 'engine'
}
]
to_print = {}
for car in test:
car_type = car['description'][0]['value'].title()
name = car['name']
power_kw = car['description'][4]['value'] + 'kw'
displacement = car['description'][1]['value'] + 'cc'
power_ps = car['description'][3]['value']
try:
to_print[car_type].append('\t'.join([name, power_kw, displacement, power_ps]))
except KeyError:
to_print[car_type] = []
to_print[car_type].append('\t'.join([name, power_kw, displacement, power_ps]))
for car_type in to_print:
print(car_type)
for row in to_print[car_type]:
print(row)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.