python - 查找平均值并显示来自 csv 的最大数据(列表索引必须是整数或切片,而不是 str)#python
问题描述
python新手,想知道如何解决我的问题,我似乎无法解决。
如果用户选择一个部门(例如公共或私人)和 5 年跨度 [2010 - 2014]、[2015 - 2019],a) 显示 5 年跨度内的平均医生人数。b) 显示该时期内医生的最大数量以及出现最大值的年份。
根据用户选择:
elif sel == "B" or sel == "b":
print("="*50)
print("The average within a 5 years and when the maximum no.of dcotor occurs")
Sector = input("Please select the sector: ")
YearStart = input("Please the starting year: ")
if Sector.upper() == "Public Specialist":
Sector = 1
elif Sector.upper() == "Public Non-Specialist":
Sector = 2
elif Sector.upper() == "Private Specialist":
Sector = 3
elif Sector.upper() == "Private Non-Specialist":
Sector = 4
for k in range(1,11):
if YearStart == data[k][0]:
for j in range(1,6):
Total += int(data[j][Sector])
break
else:
k += 1
Year = k
Average = Total/5
print(f"The average no.of doctors from {data[k][0]} - {data[k+5][0]} is {Average:.2f}")
我的 csv 数据
Year,Public Specialist,Public Non-Specialist,Private Specialist,Private Non-Specialist
2010,1996,3184,1151,2159
2011,2165,3456,1229,2220
2012,2342,3789,1293,2222
2013,2511,4150,1351,2327
2014,2829,4501,1411,2379
2015,3052,4857,1470,2444
2016,3299,5059,1485,2494
2017,3523,5050,1528,2579
2018,3741,5078,1565,2660
2019,3864,5166,1682,2757
我的问题是显示“列表索引必须是整数或切片,而不是 str”
解决方案
鉴于您在问题中显示的 .csv 数据:
Year Public Specialist Public Non-Specialist Private Specialist Private Non-Specialist
2010 1996 3184 1151 2159
2011 2165 3456 1229 2220
2012 2342 3789 1293 2222
2013 2511 4150 1351 2327
2014 2829 4501 1411 2379
2015 3052 4857 1470 2444
2016 3299 5059 1485 2494
2017 3523 5050 1528 2579
2018 3741 5078 1565 2660
2019 3864 5166 1682 2757
很明显,您尝试处理Sector
在运行时给出的值的方式是您的主要问题。
例如:
if Sector.upper() == "Public Specialist":
Sector = 1
永远不会通过,即使在Sector = "Public Specialist"
此条件将评估如下的情况下:
if "PUBLIC SPECIALIST" == "Public Specialist":
Sector = 1
因为该str.upper()
函数返回一个完全大写的字符串,其中定义了Sector
.
因此,Sector
将始终具有str
用户在运行时给出的值。当您在for
循环中进一步点击此语句时:
Total += int(data[j][Sector])
当您的代码尝试使用str
分配给的值访问列表索引时,您将收到一个错误Sector
。
您可以使用以下方法解决此问题:
if Sector.title() == "Public Specialist":
Sector = 1
# elifs using Sector.title() and current strings in your example for comparison
或者
if Sector.lower() == "public specialist"
Sector = 1
# elifs using Sector.lower and lowercase strings for comparison
可能值得查看文档以str
了解更好地理解str
Python 中的函数的方法。
进一步考虑
我不确定你想用k += 1
这个循环中的语句来实现什么:
for k in range(1,11):
if YearStart == data[k][0]:
for j in range(1,6):
Total += int(data[j][Sector])
break
else:
k += 1
但仅供参考,这基本上是一种浪费的操作,并且k
在运行时不会以任何有意义的方式改变或操纵 的值。
该表达式range(1,11)
仅计算一次,因此k
在循环中更改 的值是没有意义的,除非您打算在值更改的迭代中使用更改的值进行一些处理。当前迭代结束时,k
将成为定义循环边界的迭代器中定义的下一个值range(1,11)
。
我注意到您在原始问题(willkómmen!)中说您是 Python 的新手,所以我理解您可能认为这是您需要迭代for
循环的方式(即手动),但您不需要。将通过直接跟随它的缩进代码的每次迭代for k in range(1,11):
来迭代自己的值,而无需您自己使用.k = 1
k = 10
k += 1
希望这会有所帮助,祝你好运:)
推荐阅读
- flutter - TextFormField,更改图标和文本颜色
- c - 链接到 ELF 文件的文本文件 - _binary_file_size 信息是垃圾
- python - Keras 中的 3D 卷积是否适用于 RGB 视频?
- r - 包括子组或合并 OLS 的面板数据
- php - 在 Woocommerce 循环中间插入突出显示的产品 div
- akka - 基于 akka-cluster 的应用程序的自动横向扩展/缩减设置
- serialization - 如何使用 YamlDotNet 序列化对象树
- excel - Excel VBA将内容从一个工作表复制到另一个工作簿工作表
- powershell - 在 PowerShell 中获取 PATH 环境变量
- python-3.x - Openpyxl - 在不同列中打印两个值而不替换,然后更改行