首页 > 解决方案 > 查找平均值并显示来自 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”

标签: python

解决方案


鉴于您在问题中显示的 .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了解更好地理解strPython 中的函数的方法。

进一步考虑

我不确定你想用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 = 10k += 1

希望这会有所帮助,祝你好运:)


推荐阅读