【问题标题】:Simpler way of creating a new dictionary with the values of another dictionary as keys, and the number of occurrences as the value创建一个新字典的更简单方法,其中另一个字典的值作为键,出现次数作为值
【发布时间】:2021-12-19 05:58:48
【问题描述】:

我不会进一步解释,而是首先提供一些我的代码的上下文,这些代码有效但似乎效率很低:

def get_quantities(table_to_foods: Dict[str, List[str]]) -> Dict[str, int]:
    """The table_to_foods dict has table names as keys (e.g., 't1', 't2', and
    so on) and each value is a list of foods ordered for that table.

    Return a dictionary where each key is a food from table_to_foods and each
    value is the quantity of that food that was ordered.
    
    >>> get_quantities({'t1': ['Vegetarian stew', 'Poutine', 'Vegetarian stew'],
    't3': ['Steak pie', 'Poutine', 'Vegetarian stew'], 't4': ['Steak pie', 'Steak pie']})

    {'Vegetarian stew': 3, 'Poutine': 2, 'Steak pie': 3}    

    >>> get_quantities({'t1': ['pie'],
    't2': ['orange pie'], 't3': ['pie']})

    {'pie': 2, 'orange pie': 1} 
    """

    food_to_quantity = {}
    
    # Accumulate the food information here.

    # Creating a dictionary with the new keys as values from the other
    for j in table_to_foods.values():
      for a in j:
        food_to_quantity[a] = 0
    
    # Increment based on number of occurrences
    for j in table_to_foods.values():
      for a in j:
        food_to_quantity[a] += 1

    return food_to_quantity

必须有一种更简单的方法来创建一个新字典,其中 table_to_foods 的值作为键,任何食物值的出现次数作为值。

【问题讨论】:

    标签: python list dictionary accumulate


    【解决方案1】:

    您可以使用collections.Counteritertools.chain

    from collections import Counter
    from itertools import chain
    
    def get_quantities(d):
        return dict(Counter(chain.from_iterable(d.values())))
    
    d1 = {'t1': ['Vegetarian stew', 'Poutine', 'Vegetarian stew'], 't3': ['Steak pie', 'Poutine', 'Vegetarian stew'], 't4': ['Steak pie', 'Steak pie']}
    d2 = {'t1': ['pie'], 't2': ['orange pie'], 't3': ['pie']}
    
    print(get_quantities(d1)) # {'Vegetarian stew': 3, 'Poutine': 2, 'Steak pie': 3}
    print(get_quantities(d2)) # {'pie': 2, 'orange pie': 1}
    

    (在大多数用例中,返回行中的dict 是多余的。)

    如果你不喜欢使用额外的模块,你可以这样做:

    def get_quantities(d):
        output = {}
        for lst in d.values():
            for x in lst:
                output[x] = output.get(x, 0) + 1
        return output
    

    【讨论】:

      【解决方案2】:

      我会这样做。

      table_to_foods = {'t1': ['Vegetarian stew', 'Poutine', 'Vegetarian stew'],
      't3': ['Steak pie', 'Poutine', 'Vegetarian stew'], 't4': ['Steak pie', 'Steak pie']}
      
      food_to_quantity = {}
      for foods in table_to_foods.values():
          for food in foods:
              if(food not in food_to_quantity):
                  food_to_quantity[food]=1
              else:
                  food_to_quantity[food]+=1
      
      print(food_to_quantity)
      

      输出:{'素食炖菜':3,'Poutine':2,'牛排馅饼':3}

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-05
        • 1970-01-01
        • 1970-01-01
        • 2016-09-14
        • 1970-01-01
        • 1970-01-01
        • 2014-08-15
        • 2016-02-26
        相关资源
        最近更新 更多