在列表中查找字典的重复项并将其合并到Python中

时间:2020-07-31 18:01:56

标签: python dictionary list-comprehension

我有以下词典列表:

"ingredients": [
            {
                "unit_of_measurement": {"name": "Pound (Lb)", "id": 13},
                "quantity": "1/2",
                "ingredient": {"name": "Balsamic Vinegar", "id": 12},
            },
            {
                "unit_of_measurement": {"name": "Pound (Lb)", "id": 13},
                "quantity": "1/2",
                "ingredient": {"name": "Balsamic Vinegar", "id": 12},
            },
            {
                "unit_of_measurement": {"name": "Tablespoon", "id": 15},
                "ingredient": {"name": "Basil Leaves", "id": 14},
                "quantity": "3",
            },
        ]

我希望能够找到配料的重复项(按名称或ID)。如果有重复项并且具有相同的unit_of_measurement,则将它们合并为一个词典并相应地添加数量。因此,以上数据应返回:

[
        {
            "unit_of_measurement": {"name": "Pound (Lb)", "id": 13},
            "quantity": "1",
            "ingredient": {"name": "Balsamic Vinegar", "id": 12},
        },
        {
            "unit_of_measurement": {"name": "Tablespoon", "id": 15},
            "ingredient": {"name": "Basil Leaves", "id": 14},
            "quantity": "3",
        },
    ]

我该怎么办?

1 个答案:

答案 0 :(得分:3)

假设您有一个这样表示的字典:

data = {
    "ingredients": [
        {
            "unit_of_measurement": {"name": "Pound (Lb)", "id": 13},
            "quantity": "1/2",
            "ingredient": {"name": "Balsamic Vinegar", "id": 12},
        },
        {
            "unit_of_measurement": {"name": "Pound (Lb)", "id": 13},
            "quantity": "1/2",
            "ingredient": {"name": "Balsamic Vinegar", "id": 12},
        },
        {
            "unit_of_measurement": {"name": "Tablespoon", "id": 15},
            "ingredient": {"name": "Basil Leaves", "id": 14},
            "quantity": "3",
        },
    ]
}

您可以使用collections.defaultdict列表通过(name, id)分组键对成分进行分组:

from collections import defaultdict

ingredient_groups = defaultdict(list)
for ingredient in data["ingredients"]:
    key = tuple(ingredient["ingredient"].items())
    ingredient_groups[key].append(ingredient)

然后,您可以遍历此defaultdict的分组值,并使用fractions.Fractions计算分数量的总和。对于unit_of_measurementingredient,我们可能只使用第一个分组的值。

from fractions import Fraction

result = [
    {
        "unit_of_measurement": value[0]["unit_of_measurement"],
        "quantity": str(sum(Fraction(ingredient["quantity"]) for ingredient in value)),
        "ingredient": value[0]["ingredient"],
    }
    for value in ingredient_groups.values()
]

然后哪个会给你这个结果:

[{'ingredient': {'id': 12, 'name': 'Balsamic Vinegar'},
  'quantity': '1',
  'unit_of_measurement': {'id': 13, 'name': 'Pound (Lb)'}},
 {'ingredient': {'id': 14, 'name': 'Basil Leaves'},
  'quantity': '3',
  'unit_of_measurement': {'id': 15, 'name': 'Tablespoon'}}]

您可能需要修改以上内容,以说明具有不同单位或度量的成分,但这应该可以帮助您入门。

相关问题