首页 > 解决方案 > 针对列表中的元素创建多个字典

问题描述

我有一个列表,如下所示:

dl = [['Part Number', 'W501', 'W502', 'W503', 'W504', 'W505', 'W506', 'W507'],
 ['Weight (Kgs) *', 1.653, 0.14, 0.1, 0.11, 0.11, 1.19, 0.71],
 ['Volume Month *', 2000, 2000, 2000, 2000, 2000, 2000, 2000],
 ['Emitter Name', 'Foo'],
 ['Emitter Location', 'Manesar'],
 ['Contact person Name', 'bar'],
 ['Designation', 'Project'],
 ['Contact Number', '123456'],]

如何n根据最大列表中的元素减去 1 创建字典数量。例如,这里n是 7。

如果列表的长度为 2,那么它的元素应该在每个字典中。键是列表的第一个元素,以下是值。

预期输出:

p1 = {'Part Number':'W501', 'Weight (Kgs) *':1.63, 'Emitter Name': 'Foo', ...}
p2 = {'Part Number':'W502', 'Weight (Kgs) *':0.14, 'Emitter Name': 'Foo', ...}

标签: python

解决方案


你可以使用 list 和 dict 理解来做这样的事情:

dl = [['Part Number', 'W501', 'W502', 'W503', 'W504', 'W505', 'W506', 'W507'],
 ['Weight (Kgs) *', 1.653, 0.14, 0.1, 0.11, 0.11, 1.19, 0.71],
 ['Volume Month *', 2000, 2000, 2000, 2000, 2000, 2000, 2000],
 ['Emitter Name', 'Foo'],
 ['Emitter Location', 'Manesar'],
 ['Contact person Name', 'bar'],
 ['Designation', 'Project'],
 ['Contact Number', '123456']]

n = max(len(value) for value in dl)

every_dict = {value[0]: value[1] for value in dl if len(value) == 2}

specific_dict = [{value[0]: value[i] for value in dl if len(value) == n} for i in range(1, n)]

combined_dict = [{**specific, **every_dict} for specific in specific_dict]  

输出:

>>> import json
>>> print(json.dumps(combined_dict, indent=2))
[
  {
    "Part Number": "W501",
    "Weight (Kgs) *": 1.653,
    "Volume Month *": 2000,
    "Emitter Name": "Foo",
    "Emitter Location": "Manesar",
    "Contact person Name": "bar",
    "Designation": "Project",
    "Contact Number": "123456"
  },
  {
    "Part Number": "W502",
    "Weight (Kgs) *": 0.14,
    "Volume Month *": 2000,
    "Emitter Name": "Foo",
    "Emitter Location": "Manesar",
    "Contact person Name": "bar",
    "Designation": "Project",
    "Contact Number": "123456"
  },
  {
    "Part Number": "W503",
    "Weight (Kgs) *": 0.1,
    "Volume Month *": 2000,
    "Emitter Name": "Foo",
    "Emitter Location": "Manesar",
    "Contact person Name": "bar",
    "Designation": "Project",
    "Contact Number": "123456"
  },
  {
    "Part Number": "W504",
    "Weight (Kgs) *": 0.11,
    "Volume Month *": 2000,
    "Emitter Name": "Foo",
    "Emitter Location": "Manesar",
    "Contact person Name": "bar",
    "Designation": "Project",
    "Contact Number": "123456"
  },
  {
    "Part Number": "W505",
    "Weight (Kgs) *": 0.11,
    "Volume Month *": 2000,
    "Emitter Name": "Foo",
    "Emitter Location": "Manesar",
    "Contact person Name": "bar",
    "Designation": "Project",
    "Contact Number": "123456"
  },
  {
    "Part Number": "W506",
    "Weight (Kgs) *": 1.19,
    "Volume Month *": 2000,
    "Emitter Name": "Foo",
    "Emitter Location": "Manesar",
    "Contact person Name": "bar",
    "Designation": "Project",
    "Contact Number": "123456"
  },
  {
    "Part Number": "W507",
    "Weight (Kgs) *": 0.71,
    "Volume Month *": 2000,
    "Emitter Name": "Foo",
    "Emitter Location": "Manesar",
    "Contact person Name": "bar",
    "Designation": "Project",
    "Contact Number": "123456"
  }
]

推荐阅读