【问题标题】:How to create and increment a value in a dictionary from a list using dictionary comprehension如何使用字典理解从列表中创建和增加字典中的值
【发布时间】:2020-03-16 07:59:01
【问题描述】:

我正在创建一个简单的函数,它接受一个数字列表并返回一个包含所有奇数和偶数总和的字典。

我可以使用传统的for 循环来做到这一点,所以我想知道是否有办法使用字典理解来做到这一点。我试过了,但我找不到使用+= 增加理解内每个值的方法。

这是我的带有for 循环的代码:

def sum(a):
    results = {"even":0, "odd":0}
    for val in a:
        if val % 2 == 0:
            results["even"] += val
        elif val % 2 != 0:
            results["odd"] += val

这是我使用字典理解的尝试:

def sum(a):
    results = {even:+=x if x % 2 == 0 else "odd" for x in a}

【问题讨论】:

    标签: python dictionary increment dictionary-comprehension


    【解决方案1】:

    您不能在 dict 理解范围内分配/重新分配 key
    无论如何,单次遍历都比具有 2 次遍历的潜在单行更好:

    更简化/简洁的版本:

    def sum_odd_even_numbers(lst):
      d = {"even": 0, "odd": 0}
      for val in lst:
          d['even' if val % 2 == 0 else 'odd'] += val
      return d
    
    print(sum_odd_even_numbers([2,4,5,7,8]))   # {'even': 14, 'odd': 12}
    

    【讨论】:

    • 非常感谢您的帮助!
    【解决方案2】:

    没有办法做到这一点有效地。它可以是一个内衬,但是你正在做两次迭代而不是一次:

    def sum_odd_even(a):
       return {'odd': sum(x for x in a if x % 2), 'even': sum(x for x in a if x % 2 == 0)}
    

    你最好按照现在的方式去做。话虽如此,不要命名函数sum。它是一个内置函数。

    你最好循环现在的状态,因为它只需要一次迭代:

    def sum_odd_even(a):
      results = {"even":0, "odd":0}
      for val in a:
        if val % 2 == 0:
          results["even"] += val
        else:
          results["odd"] += val
    

    【讨论】:

    • 非常感谢您的帮助!我只是想知道是否有办法做到这一点。根据您的建议,我将使用 for 循环版本。
    猜你喜欢
    • 2019-01-16
    • 2019-09-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 2020-11-12
    • 2018-08-04
    相关资源
    最近更新 更多