遍历字典列表并创建新的字典列表

4

我的数据如下。

[
    {
        "id" : "123",
        "type" : "process",
        "entity" : "abc"
    },
    {
        "id" : "456",
        "type" : "product",
        "entity" : "ab"
    }

]

我正在循环遍历以下内容以获取id和实体

for test in serializer.data:
    qaResultUnique['id'] = test['id']
    qaResultUnique['entity'] = test['entity']
    uniqueList.append(qaResultUnique)

但是得到错误的输出,每次只收到第二个字典。

[
        {
            "id" : "456",
            "entity" : "ab"
        },
        {
            "id" : "456",
            "entity" : "ab"
        }

    ]

我做错了什么,请帮忙。

2
新列表中的两个元素是相同的字典。 - M4rtini
4个回答

8
您正在重复使用qaResultUnique字典对象。请在每次循环中创建一个新的字典:
for test in serializer.data:
    qaResultUnique = {}
    qaResultUnique['id'] = test['id']
    qaResultUnique['entity'] = test['entity']
    uniqueList.append(qaResultUnique)

更简洁地表达,即:
uniqueList = [{'id': test['id'], 'entity': test['entity']} for test in serializer.data]

4

正如@Martijn解释的那样,你可以使用字典推导式来实现这个功能,像这样:

keys = {"type"}
print [{k:c_dict[k] for k in c_dict if k not in keys} for c_dict in data]
# [{'id': '123', 'entity': 'abc'}, {'id': '456', 'entity': 'ab'}]

您可以使用此方法跳过任意数量的 keys,而无需更改字典推导部分。例如,如果您需要跳过 typeentity 两个键。
keys = {"type", "entity"}
print [{k:c_dict[k] for k in c_dict if k not in keys} for c_dict in data]
# [{'id': '123'}, {'id': '456'}]

字典推导式仅适用于Python 2.7+。 - Matt Briançon

1

只需像这样进行修改。

之前:

uniqueList.append(qaResultUnique)

之后:

uniqueList.append(dict(qaResultUnique))

1
你可以像以下这样做。
for test in serializer.data:
    uniqueList.append({'id':test['id'],'entity':test['entity']})

或者使用列表推导式。
uniqueList=[{'id':test['id'],'entity':test['entity']} for test in serializer.data]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接