首页 > 解决方案 > 将 api 响应操作到对象键/值对列表中

问题描述

无法为我的前端处理这些数据。

这是我的 API 响应,它是一个字典列表:

    {
      "name": "bob",
      "age": 22,
      "gender": male
     },
      {
      "name": "zack",
      "age": 43,
      "gender": male
     }

这是所需的输出,另一个字典列表:

{id: 0, column: "age", bob: 22, zack: 43},
{id: 1, column: "gender", bob: male, zack: male}

因此,如果返回另一个名称,则只需将其添加为键并获取年龄/性别等的相应值。

这是我目前得到的输出:

{id: 0, column: "age", bob: 22},
{id: 1, column: "gender", bob: male},

{id: 0, column: "age", zack: 43},
{id: 1, column: "gender", zack: male}

因此,对于每个 dicts 列表,我选择列,使用名称具有一种标识符,并为特定列分配相应的值。

我无法将每个人的姓名(在这种情况下为键)添加到具有相应值、年龄、性别等的相同字典列表中。这是我目前拥有的代码。

my_list = []

counter = 0
for d in data:
    for k, v in d.items():
        dict = {}
        length = len(d.keys())
        if counter == length:
            counter = 0
        value = d['name']
        dict['id'] = counter
        dict['column'] = k
        dict[value] = v
        my_list.append(dict)
        counter += 1 

有人可以指出我正确的方向吗?

标签: pythonlistdictionary

解决方案


利用:

data = [{
    "name": "bob",
    "age": 22,
    "gender": "male"
},
    {
        "name": "zack",
        "age": 43,
        "gender": "male"
    }]

keys = ["age", "gender"]

lookup = {key: {"id": i, "column" : key} for i, key in enumerate(keys)}

for d in data:
    name = d.pop("name")
    for key, value in d.items():
        lookup[key][name] = value

res = list(lookup.values())
print(res)

输出

[{'id': 0, 'column': 'age', 'bob': 22, 'zack': 43}, {'id': 1, 'column': 'gender', 'bob': 'male', 'zack': 'male'}]

或者不改变原始字典的替代方法:

keys = ["age", "gender"]
lookup = {key: {"id": i, "column" : key} for i, key in enumerate(keys)}

for d in data:
    name = d["name"]
    for key in (d.keys() - {"name"}):
        lookup[key][name] = d[key]

res = list(lookup.values())
print(res)

输出

[{'id': 0, 'column': 'age', 'bob': 22, 'zack': 43}, {'id': 1, 'column': 'gender', 'bob': 'male', 'zack': 'male'}]

更新

如果事先不知道密钥,您可以执行以下操作:

lookup = {}
for d in data:
    name = d["name"]
    for key in (d.keys() - {"name"}):
        if key not in lookup:
            lookup[key] = {key: {"id": len(lookup), "column": key}}
        lookup[key][name] = d[key]

res = list(lookup.values())
print(res)

推荐阅读