繁体   English   中英

遍历嵌套字典列表

[英]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&regdate=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&regdate=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&regdate=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&regdate=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&regdate=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&regdate=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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM