循环遍历嵌套字典列表

时间:2017-01-26 12:03:44

标签: python

我有一系列字典如下:

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的新手,因此欢迎任何帮助。

2 个答案:

答案 0 :(得分:4)

在不知道您希望获得结果的数据/集合类型的情况下,以下内容将打印您想要的结果。

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

答案 1 :(得分:2)

第一步是迭代初始列表中的每个项目。看起来每个项目都可以被视为汽车。然后,您只需要提取您感兴趣的所有信息。 由于您希望将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)