在Python数组

时间:2017-11-20 05:34:58

标签: python sorting max min

上下文:继续我对Python的自学,我最近完成了一个课本练习,要求一个程序允许用户定义'x'年,并能够输入,对于'x'中的每个月,降雨量值。

问题:下面是我的代码,其工作正常,但是最新的练习要求我'扩展'我的代码以在打印语句中显示数字上最大和最小的用户输入降雨量值

披露:我已经看过S.O尝试找到我的问题的解决方案,但似乎没有什么能够接近我的挑战,帮助我。

我尝试过的内容:我尝试过使用max()min()但是当我输入代码{{1}时,我一直收到TypeError: 'int' object is not iterable }或print(max(monthlyRainfall)

print(min(monthlyRainfall)

是否有人能够提供一些关于我哪里出错的“指示”?

2 个答案:

答案 0 :(得分:1)

您可以使用sys.maxsize0来使用变量来跟踪实际上用户永远不会分别高于或低于此值的最小和最大降雨量值。

然而,对于第二种情况,只是为了确保您还可以添加一个简单的检查,以确保用户不输入负降雨量:

def calculationAlgorithm(userYearsTracking):
    totalMonths = 0
    totalRainfall = 0
    maxRainfall = 0
    minRainfall = sys.maxsize
    for currentYear in range (1, userYearsTracking +1):
        for currentMonth in range (1, 13):
            monthlyRainfall = int(input("Inches of rainfall for month " + format(currentMonth, "d",) + " | year " +
                                    format(currentYear, "d",)+": "))
            if monthlyRainfall < 0:
                print("Error invalid rainfall entered")
                sys.exit()
            if monthlyRainfall > maxRainfall:
                maxRainfall = monthlyRainfall
            if monthlyRainfall < minRainfall:
                minRainfall = monthlyRainfall
            totalMonths += 1
            totalRainfall += monthlyRainfall
    averageRainfall = totalRainfall / totalMonths
    print("Total months: " + str(totalMonths))
    print("Total rain:", format(totalRainfall), "(inch)")
    print("Total average rainfall:", round(averageRainfall,2), "(inch)")
    print("Largest input rainfall: " + str(maxRainfall))
    print("Smallest input rainfall: " + str(minRainfall))

使用上述更改 here.

试用完整的程序

使用示例:

How many years do you want to track:  1
Inches of rainfall for month 1 | year 1:  2
Inches of rainfall for month 2 | year 1:  2
Inches of rainfall for month 3 | year 1:  2
Inches of rainfall for month 4 | year 1:  2
Inches of rainfall for month 5 | year 1:  4
Inches of rainfall for month 6 | year 1:  1
Inches of rainfall for month 7 | year 1:  2
Inches of rainfall for month 8 | year 1:  2
Inches of rainfall for month 9 | year 1:  2
Inches of rainfall for month 10 | year 1:  2
Inches of rainfall for month 11 | year 1:  2
Inches of rainfall for month 12 | year 1:  2
Total months: 12
Total rain: 25 (inch)
Total average rainfall: 2.08 (inch)
Largest input rainfall: 4
Smallest input rainfall: 1

N.B。我仅使用 camelCase 命名新变量,因为这是您正在使用的样式。我建议将程序中变量的所有名称更改为snake_case,因为这是python中的约定。

答案 1 :(得分:0)

Python的内置min()和max()函数期望可迭代对象,如 list,set 等。我认为你只放了一个不正确的整数(如果只给出1个数字,你如何选择最小或最大数字 - 显然它是机器人最小值和最大值)。 这样做的一种方法是:

  1. 声明列表var:

    rainfallList = []

  2. 然后,当您获得monthlyRainfall时,您应该添加以下代码:

    rainfallList.append(monthlyRainfall)

  3. 毕竟for循环你可以使用 min(rainfallList)和/或 max(rainfallList)

  4. 所以你的最终代码应该是:

    def yearsToTrack():
        userYearsTracking = int(input("How many years do you want to track: "))
        return userYearsTracking
    
    def calculationAlgorithm(userYearsTracking):
        totalMonths = 0
        totalRainfall = 0
    
        rainfallList = []
    
        for currentYear in range (1, userYearsTracking +1):
            for currentMonth in range (1, 13):
                monthlyRainfall = int(input("Inches of rainfall for month " + format(currentMonth, "d",) + " | year " +
                                        format(currentYear, "d",)+": "))
                totalMonths += 1
                rainfallList.append(monthlyRainfall)
    
                totalRainfall += monthlyRainfall
        averageRainfall = totalRainfall / totalMonths
        print("Total months: " + str(totalMonths))
        print("Total rain:", format(totalRainfall), "(inch)")
        print("Total average rainfall:", round(averageRainfall,2), "(inch)")
        print("Min rain:", format(min(rainfallList)), "(inch)")
        print("Max rain:", format(max(rainfallList)), "(inch)")
    
    def main():
        userYearsTracking = yearsToTrack()
        calculationAlgorithm(userYearsTracking)
    main()