简体   繁体   English

在公共键值列表中合并字典

[英]Merge dictionaries in a list on common key-value

What is the pythonic way to properly merge dictionaries in a list Given list of dictionaries:在列表中正确合并字典的pythonic方法是什么给定的字典列表:

[
    {
        "introduced_at": "28.12.2000",
        "item": "Pizza",
        "item_price": [
            {
                "date": "01.01.2011",
                "details": [
                    {"price": 1000, "changed_by": "Dieter"},
                    {"price": 900, "changed_by": "Nina"},
                ],
            }
        ],
    },
    {
        "introduced_at": "28.12.2000",
        "item": "Pizza",
        "item_price": [
            {
                "date": "01.01.2012",
                "details": [
                    {"price": 1050, "changed_by": "Dieter"},
                    {"price": 900, "changed_by": "Nina"},
                ],
            }
        ],
    },
]

expected:预期的:

{
    "price_dev": [
        {
            "introduced_at": "28.12.2000",
            "item": "Pizza",
            "item_price": [
                {
                    "date": "01.01.2011",
                    "details": [
                        {"price": 1000, "changed_by": "Dieter"},
                        {"price": 900, "changed_by": "Nina"},
                    ],
                },
                {
                    "date": "01.01.2012",
                    "details": [
                        {"price": 1050, "changed_by": "Dieter"}
                    ],
                },
            ],
        }
    ]
}

The key item and its value in combination with their introduced_at can be found twice in the list so they may be used as unique idenfitiers to merge the entries on.可以在列表中找到两次键item及其值及其introduced_at的值,因此它们可以用作合并条目的唯一标识符。 As for the details, since date are both different, they should be displayed seperately.至于细节,由于date不同,应该分开显示。 Duplicates as seen in changed_by Nina should be disregarded.changed_by Nina 中看到的重复应该被忽略。

I have tried this.我试过这个。 can you check it is correct or not.你能检查它是否正确。

dl = [
    {
        "introduced_at": "28.12.2000",
        "item": "Pizza",
        "item_price": [
            {
                "date": "01.01.2011",
                "details": [
                    {"price": 1000, "changed_by": "Dieter"},
                    {"price": 900, "changed_by": "Nina"},
                ],
            }
        ],
    },
    {
        "introduced_at": "28.12.2000",
        "item": "Pizza",
        "item_price": [
            {
                "date": "01.01.2012",
                "details": [
                    {"price": 1050, "changed_by": "Dieter"},
                    {"price": 900, "changed_by": "Nina"},
                ],
            }
        ],
    },
]
ans_dict = {}
pre_list = []
for data in dl:
    if not pre_list:
        pre_list.append(data)
    else:
        for items, index in zip(pre_list, range(len(pre_list))):
            if items['introduced_at'] == data['introduced_at'] and items['item'] == data['item']:
                for item_data in data['item_price']:
                    for old_items in items['item_price']:
                        if item_data['date'] != old_items['date']:
                            pairs = zip(item_data['details'], old_items['details'])
                            add_dic = [x for x, y in pairs if x != y]
                    items['item_price'].append({"date": item_data['date'], "details": add_dic})

ans_dict["price_dev"] = pre_list
print(ans_dict)

output: output:

{
  'price_dev': [
    {
      'introduced_at': '28.12.2000',
      'item': 'Pizza',
      'item_price': [
        {
          'date': '01.01.2011',
          'details': [
            {
              'price': 1000,
              'changed_by': 'Dieter'
            },
            {
              'price': 900,
              'changed_by': 'Nina'
            }
          ]
        },
        {
          'date': '01.01.2012',
          'details': [
            {
              'price': 1050,
              'changed_by': 'Dieter'
            }
          ]
        }
      ]
    }
  ]
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM