gpt4 book ai didi

python - 查找平均值并显示来自 csv 的最大数据(列表索引必须是整数或切片,而不是 str)#python

转载 作者:行者123 更新时间:2023-12-04 09:16:33 25 4
gpt4 key购买 nike

python新手,想知道如何解决我的问题,我似乎无法解决。
如果用户选择一个部门(例如公共(public)或私有(private))和 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])
当您的代码尝试使用分配给 strSector 值访问列表索引时,您将收到一个错误。
您可以使用以下方法解决此问题:
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
可能值得查看 docs for str methods 以更好地理解 Python 中的 str 函数。
进一步考虑
我不确定您要在此循环中使用语句 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 = 1k = 10 中为紧跟在它后面的缩进代码的每次迭代进行自我迭代,而无需您自己使用 k += 1 递增它。
希望这会有所帮助,祝你好运:)

关于python - 查找平均值并显示来自 csv 的最大数据(列表索引必须是整数或切片,而不是 str)#python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63188085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com