【问题标题】:python dictionary type error sum wont calculatepython字典类型错误总和不会计算
【发布时间】:2021-10-09 19:30:15
【问题描述】:
def calculate_average_rating(input):
    final = {}
    for key in input.keys():
        avg = sum(input[key])/len(input[key])
        final[key] = avg
    return final

我的代码打算取一个字典输入,“狮子王(2019)”:[6.0,7.5,5.1],“泰坦尼克号(1997)”:[7],并计算每个分数的平均值电影并以字典形式返回。例如:“蜘蛛侠(2002)”:[3,2,4,5]} ==> {“蜘蛛侠(2002)”:3.5

我得到的错误是

TypeError                                 Traceback (most recent call last)
<ipython-input-134-8a09678d0016> in <module>
----> 1 calculate_average_rating(ratingData)

<ipython-input-133-3a0eaee00f3b> in calculate_average_rating(input)
      2     final = {}
      3     for key in input.keys():
----> 4         avg = sum(input[key])/len(input[key])
      5         final[key] = avg
      6     return final

TypeError: unsupported operand type(s) for +: 'int' and 'str'

【问题讨论】:

  • 不要使用input作为变量名——它是一个内置的python
  • 即使更改输入名称仍然没有改变任何东西
  • 也许 dict 条目中的某些评分是 str 类型,而不是 floatint
  • 'Toy Story (1995)': ['4.0', '4.0', '4.5', '2.5', '4.5', '3.5'], 'Jumanji (1995)': [ '4.0', '4.0', '3.0', '3.0', '3.0', '3.5'],这是我的输入
  • 嘿,等一下,你说你的输入是:"The Lion King (2019)" : [6.0, 7.5, 5.1]

标签: python python-3.x dictionary


【解决方案1】:

看来您需要对评分进行预处理:

def calculate_average_rating(ratings):
    final = {}
    for key in ratings.keys():
        film = [float(item) for item in ratings[key]]
        avg = sum(film)/len(film)
        final[key] = avg
    return final

【讨论】:

    【解决方案2】:
    def calculate_average_rating(input):
        final = {}
        for key in input.keys():
            avg = sum(map(lambda x : int(x),input[key]))/len(input[key])
            final[key] = avg
        return final
    

    【讨论】:

    • 你为什么使用 lambda 表达式?
    • 它可以将任何字符串或浮点数据转换为整数类型,因此我们不会出现类型错误。
    • 但是为什么是 lambda 表达式?这是完全没有意义的。你只想要int...为什么lambda x: int(x)
    • @juanpa.arrivillaga,更令人困惑的是值实际上是浮动的,int() 调用只会抛出异常。
    • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
    【解决方案3】:

    试试下面的 1 条衬里

    import statistics 
    data = {"The Lion King (2019)" : ['6.0', '7.5', '5.1'], "Titanic (1997)": ['7']}
    
    avg = {k: statistics.mean([float(x) for x in v]) for k,v in data.items()}
    print(avg)
    

    输出

    {'The Lion King (2019)': 6.2, 'Titanic (1997)': 7.0}
    

    【讨论】:

    • 不是反对票,但考虑到问题的第一个版本,他们的代码工作正常。这并没有解决他们遇到的错误——它只是做一个做同样事情并引发同样异常的一个班轮。
    • @Mark 代码已更新 - 仍然是 1 行,但它也可以处理字符串。
    猜你喜欢
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 2023-04-09
    • 2020-03-31
    • 2022-11-09
    相关资源
    最近更新 更多