簡體   English   中英

在列表中查找字典的重復項並將它們組合到 Python

[英]Find duplicates of dictionary in a list and combine them in Python

我有這個字典列表:

"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",
        },
    ]

我該怎么做 go 呢?

假設您有一個像這樣表示的字典:

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的分組值 go ,並使用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'}}]

您可能需要修改上述內容以說明具有不同單位或測量值的成分,但這應該可以幫助您入門。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM