繁体   English   中英

在 Python 中将列表转换为嵌套字典时出现问题

[英]Problem converting list to nested dictionary in Python

我对 Python 相当陌生,并且正在使用嵌套字典。 我从下面的网页收到一个字典列表是一个例子:

    Recipes = [{'Ingredient': 'Pork Mince', 'Quantity': 1, 'Recipe': 'Chilli Tofu'},
     {'Ingredient': 'Courgettes', 'Quantity': 2, 'Recipe': 'Chilli Tofu'},
     {'Ingredient': 'Firm Tofu', 'Quantity': 1, 'Recipe': 'Chilli Tofu'},
     {'Ingredient': 'Garlic', 'Quantity': 1, 'Recipe': 'Chilli Tofu'},
     {'Ingredient': 'Chilli Bean Paste', 'Quantity': 1, 'Recipe': 'Chilli Tofu'},
     {'Ingredient': 'Chillies', 'Quantity': 1, 'Recipe': 'Chilli Tofu'},
     {'Ingredient': 'Spring Onions', 'Quantity': 2, 'Recipe': 'Chilli Tofu'},
     {'Ingredient': 'Courgettes', 'Quantity': 2, 'Recipe': 'Prawn & Courgettes'},
     {'Ingredient': 'Prawns', 'Quantity': 1, 'Recipe': 'Prawn & Courgettes'},
     {'Ingredient': 'Onions', 'Quantity': 1, 'Recipe': 'Prawn & Courgettes'},
     {'Ingredient': 'Garlic', 'Quantity': 1, 'Recipe': 'Prawn & Courgettes'},
     {'Ingredient': 'Chillies', 'Quantity': 1, 'Recipe': 'Prawn & Courgettes'}]

我想将其格式化为嵌套字典,以便最终将字典的“配方”值作为键,并将成分和数量作为子字典的一部分。 所以它看起来像这样......

{'Chilli Tofu': {
     'Spring Onions': 2,
     'Pork Mince': 1,
     'Firm Tofu': 1,
     'Courgettes': 2,
     'Garlic': 1,
     'Chilli Bean Paste': 1,
     'Chillies':1,
     'Spring Onions': 2
}, 
'Prawn & Courgettes': {
     'Chillies': 1,
     'Courgettes': 2,
      etc...
}}

我可以通过以下代码部分实现:

format_recipes = {}
for r in recipes:
    format_recipes[r['Recipe']] = {r['Ingredient']: r['Quantity']}

但是,当我运行上述内容时,我只会得到一个包含以下内容的字典:

{'Chilli Tofu': {'Spring Onions': 2}, 'Prawn & Courgettes': {'Chillies': 1}}

似乎我的嵌套字典在循环中不断被覆盖,我只能得到该食谱列表中的最后一个成分和数量。

我不确定如何防止这种情况发生,并将 append 放到键:值对列表中,而不是覆盖它们。 有任何想法吗?

干杯

问题是您实际上是在每次迭代替换配方,您需要将 append 它作为字典列表:

首先,您需要为每个配方定义空列表,然后 append 每个成分

解决方案:

format_recipes = {}

for r in recipes:
    format_recipes[r['Recipe']] = []

for r in recipes:
    format_recipes[r['Recipe']].append({r['Ingredient']: r['Quantity']})

每次执行时都会覆盖字典值:

format_recipes[r['Recipe']] = {r['Ingredient']: r['Quantity']}

您可以将updatesetdefault一起使用,这将设置初始嵌套字典:

format_recipes = {}
for item in Recipes:
    format_recipes.setdefault(item['Recipe'], {}).update({item['Ingredient']: item['Quantity']})

format_recipes 将是:

{'Chilli Tofu': {'Pork Mince': 1,
  'Courgettes': 2,
  'Firm Tofu': 1,
  'Garlic': 1,
  'Chilli Bean Paste': 1,
  'Chillies': 1,
  'Spring Onions': 2},
 'Prawn & Courgettes': {'Courgettes': 2,
  'Prawns': 1,
  'Onions': 1,
  'Garlic': 1,
  'Chillies': 1}}

暂无
暂无

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

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