从python中的字典中删除基于分组的键/值对 [英] Remove key-value pair based on grouping from dictionaries in python

查看:106
本文介绍了从python中的字典中删除基于分组的键/值对的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个JSON文件A.json,其中包含多个字典.我想从键模型" grouped by brand中删除常见的键值对.

I have a JSON file A.json which contains multiple dictionaries. And I want to remove common key-value pairs from key "model" grouped by brand.

例如,考虑以下品牌:福特":

For example, consider the brand: "Ford":

{"Number": '123', "brand": "Ford", "model":{"Mustang1":"2.64", "Mustang2":"3.00", "Mustang3":"1.00", "Mustang4":"1.64"}}

{"Number": '891', "brand": "Ford", "model":{"Mustang1":"2.64", "Mustang8":"3.00", "Mustang3":"1.00", "Mustang6":"1.64"}}

model中的键在两个词典中都是相同的,它们分别是Mustang1Mustang3.因此,我从模型中删除了两个键值对. 最终字典为:

Keys in key model which are common across both the dictionaries are Mustang1 and Mustang3. So I removed both of the key-value pair from model. Final dictionaries would be:

 {"Number": '123', "brand": "Ford", "model":{"Mustang2":"3.00", "Mustang4":"1.64"}}
{"Number": '891', "brand": "Ford", "model":{"Mustang8":"3.00", "Mustang6":"1.64"}}

A.json

{"Number": '123', "brand": "Ford", "model":{"Mustang1":"2.64", "Mustang2":"3.00", "Mustang3":"1.00", "Mustang4":"1.64"}}
{"Number": '321', "brand": "Toyota", "model":{"Camry":"2.64", "Prius":"3.00", "Corolla":"1.00", "Tundra":"1.64"}}
{"Number": '111', "brand": "Honda", "model":{"Accord":"2.64", "Civic":"3.00", "Insight":"1.00", "Pilot":"1.64"}}
{"Number": '891', "brand": "Ford", "model":{"Mustang1":"2.64", "Mustang8":"3.00", "Mustang3":"1.00", "Mustang6":"1.64"}}
{"Number": '745', "brand": "Toyota", "model":{"Camry":"2.64", "Sienna":"3.00", "4Runner":"1.00", "Prius":"1.64"}}
{"Number": '325', "brand": "Honda", "model":{"Accord":"2.64", "Passport":"3.00", "HR-V":"1.00", "Pilot":"1.64"}}
{"Number": '745', "brand": "Accura", "model":{"TLX":"2.64", "MDX":"3.00"}}
{"Number": '325', "brand": "Accura", "model":{"TLX":"2.64", "MDX":"3.00"}}

预期结果: Result.json

Expected Result: Result.json

{"Number": '123', "brand": "Ford", "model":{"Mustang2":"3.00", "Mustang4":"1.64"}}
{"Number": '321', "brand": "Toyota", "model":{"Corolla":"1.00", "Tundra":"1.64"}}
{"Number": '111', "brand": "Honda", "model":{"Civic":"3.00", "Insight":"1.00", "Pilot":"1.64"}}
{"Number": '891', "brand": "Ford", "model":{"Mustang8":"3.00", "Mustang6":"1.64"}}
{"Number": '745', "brand": "Toyota", "model":{"Sienna":"3.00", "4Runner":"1.00"}}
{"Number": '325', "brand": "Honda", "model":{"Passport":"3.00", "HR-V":"1.00", "Civic Type R":"1.64"}}
{"Number": '745', "brand": "Accura", "model":{}}
{"Number": '325', "brand": "Accura", "model":{}}

推荐答案

首先,您的A.json不是常规的json文件.这是更正的版本:

First, your A.json is not a regular json file. Here's the corrected version:

[{"Number": "123", "brand": "Ford", "model":{"Mustang1":"2.64", "Mustang2":"3.00", "Mustang3":"1.00", "Mustang4":"1.64"}},
{"Number": "321", "brand": "Toyota", "model":{"Camry":"2.64", "Prius":"3.00", "Corolla":"1.00", "Tundra":"1.64"}},
{"Number": "111", "brand": "Honda", "model":{"Accord":"2.64", "Civic":"3.00", "Insight":"1.00", "Pilot":"1.64"}},
{"Number": "891", "brand": "Ford", "model":{"Mustang1":"2.64", "Mustang8":"3.00", "Mustang3":"1.00", "Mustang6":"1.64"}},
{"Number": "745", "brand": "Toyota", "model":{"Camry":"2.64", "Sienna":"3.00", "4Runner":"1.00", "Prius":"1.64"}},
{"Number": "325", "brand": "Honda", "model":{"Accord":"2.64", "Passport":"3.00", "HR-V":"1.00", "Pilot":"1.64"}},
{"Number": "745", "brand": "Accura", "model":{"TLX":"2.64", "MDX":"3.00"}},
{"Number": "325", "brand": "Accura", "model":{"TLX":"2.64", "MDX":"3.00"}}]

文件内容应使用json模块进行解析:

The content of the file should be parsed with the json module:

import io # to test without a file
f = io.StringIO(json_text) # json_text is a string containing the text above

import json
ds = json.load(f)

第二,您必须按品牌建立通用模型的set:

Second, you have to build a set of common models by brand:

common_by_brand = {}
for d in ds:
    if d["brand"] in common_by_brand:
        common_by_brand[d["brand"]] &= set(d["model"])
    else:
        common_by_brand[d["brand"]] = set(d["model"])
    # {'Ford': {'Mustang1', 'Mustang3'}, 'Toyota': {'Camry', 'Prius'}, 'Honda': {'Accord', 'Pilot'}, 'Accura': {'TLX', 'MDX'}}

第三,只需遍历列表并删除那些常见的模型:

Third, just iterate over the list and remove those common models:

for d in ds:
    common = common_by_brand[d["brand"]]
    d["model"] = {k: v for k, v in d["model"].items() if k not in common}
# [{'Number': '123', 'brand': 'Ford', 'model': {'Mustang2': '3.00', 'Mustang4': '1.64'}}, {'Number': '321', 'brand': 'Toyota', 'model': {'Corolla': '1.00', 'Tundra': '1.64'}}, {'Number': '111', 'brand': 'Honda', 'model': {'Civic': '3.00', 'Insight': '1.00'}}, {'Number': '891', 'brand': 'Ford', 'model': {'Mustang8': '3.00', 'Mustang6': '1.64'}}, {'Number': '745', 'brand': 'Toyota', 'model': {'Sienna': '3.00', '4Runner': '1.00'}}, {'Number': '325', 'brand': 'Honda', 'model': {'Passport': '3.00', 'HR-V': '1.00'}}, {'Number': '745', 'brand': 'Accura', 'model': {}}, {'Number': '325', 'brand': 'Accura', 'model': {}}]

第四,将结果以json格式写入文件:

Fourth, write the result in json format to a file:

g = io.StringIO()
json.dump(ds, g)
print (g.getvalue())

格式化输出:

[{"Number": "123", "brand": "Ford", "model": {"Mustang2": "3.00", "Mustang4": "1.64"}},
{"Number": "321", "brand": "Toyota", "model": {"Corolla": "1.00", "Tundra": "1.64"}},
{"Number": "111", "brand": "Honda", "model": {"Civic": "3.00", "Insight": "1.00"}},
{"Number": "891", "brand": "Ford", "model": {"Mustang8": "3.00", "Mustang6": "1.64"}},
{"Number": "745", "brand": "Toyota", "model": {"Sienna": "3.00", "4Runner": "1.00"}},
{"Number": "325", "brand": "Honda", "model": {"Passport": "3.00", "HR-V": "1.00"}},
{"Number": "745", "brand": "Accura", "model": {}},
{"Number": "325", "brand": "Accura", "model": {}}]

这篇关于从python中的字典中删除基于分组的键/值对的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆