【问题标题】:Finding the average of a list in python在python中查找列表的平均值
【发布时间】:2017-10-02 20:09:35
【问题描述】:

在对网站上已经存在的其他问题进行了一些研究后,我的程序仍然出现错误。我想找到从文本文件中获取的列表的平均值。 文本文件的布局如下:

0
dyl
1
john
2
ryan
3
Chelsey
4
bob
5
dan

这是我的代码:

a = open("stats.txt","r")

b = a.read().splitlines()

newvar = []

newvar.extend(b[0::2])

avg = sum(newvar)/len(newvar)

print(avg)

我得到的结果是:TypeError: unsupported operand type(s) for +: 'int' and 'str'

【问题讨论】:

  • 错误是正确的 - splitlines 将文件内容作为字符串列表读取。因此,即使您的行包含一个数字,由于这种用法,它实际上也是一个字符串。您要做的是将包含数字(即偶数)的行转换为整数,并分别保存。然后你应该能够获得平均值。
  • 列表b 由什么组成?整数和字符串交错? 没有。 你读了一个文件,你得到了什么?一堆字节。妥善处理它们是你的工作(即转换为整数)。
  • 您可能只是研究了该错误以找出它的含义。这是一个非常简单的方法
  • 关于如何执行此操作的任何建议?我是 python 作为一种语言的新手。我来自 C# 基本背景,其中明确提供了变量数据类型。
  • RSon 我做了,那是我最初的搜索。这导致我看到其他让我感到困惑的帖子。

标签: python list average


【解决方案1】:

问题与解决方案

您的代码的主要问题是,在读取您的文件并解析输出后,newvar 是一个字符串列表:

['0', '1', '2', '3', '4', '5']

由于sum 不会处理字符串——即使可以,你也不会得到你想要的输出——你需要将字符串转换为整数。这可以使用简单的列表推导来完成:

newvar = [int(s) for s in newvar]

然后您可以照常使用sum

sum(newvar) / len(newvar)

哪个有输出:

2

改进

以下是对原始代码的一些一般改进:

  • 使用上下文管理器语句with 打开您的文件。这样,您就可以确保您的文件始终处于关闭状态。

  • 您可以在上面的列表理解中使用“过滤器”来跳过它们,而不是使用切片来过滤掉字母数字行。

这是修改后的代码:

with open('stats.txt', 'r') as file:
    nums = [int(n) for n in file.read().splitlines() if n.isdigit()] 
avg = sum(nums) / len(nums)
print(avg)

【讨论】:

    猜你喜欢
    • 2015-05-17
    • 2012-02-20
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    相关资源
    最近更新 更多