代码之家  ›  专栏  ›  技术社区  ›  William

在Python数组中使用max()和min()失败

  •  1
  • William  · 技术社区  · 8 年前

    上下文 :继续自学Python,我最近完成了一个教科书上的练习,要求使用一个程序,允许用户定义“x”年数,并能够在“x”中每个月输入降雨量值。

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

    披露:我一直在关注S.O,试图找到我的问题的解决方案,但似乎没有什么能接近我的挑战,来帮助我。

    我试过的: 我试过使用 max() min() 然而,我一直得到一个 TypeError: 'int' object is not iterable 当我键入代码时 print(max(monthlyRainfall) print(min(monthlyRainfall)

    def yearsToTrack():
        userYearsTracking = int(input("How many years do you want to track: "))
        return userYearsTracking
    
    def calculationAlgorithm(userYearsTracking):
        totalMonths = 0
        totalRainfall = 0
        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
                totalRainfall += monthlyRainfall
        averageRainfall = totalRainfall / totalMonths
        print("Total months: " + str(totalMonths))
        print("Total rain:", format(totalRainfall), "(inch)")
        print("Total average rainfall:", round(averageRainfall,2), "(inch)")
    
    def main():
        userYearsTracking = yearsToTrack()
        calculationAlgorithm(userYearsTracking)
    main()
    

    有没有人能提供一些“指点”来说明我哪里做错了?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Sash Sinha    8 年前

    您可以使用 sys.maxsize 0 初始化用于跟踪最小和最大降雨量值的变量,实际上用户永远不会分别输入高于或低于该值的值。

    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中的惯例。

        2
  •  0
  •   Bahriddin Abdiev    8 年前

    Python的内置min()和max()函数期望类似iterable的对象 列表,集合 等等。我认为你只放了一个不太正确的整数(当只有一个数字时,你怎么能选择最小值或最大值-显然它是bot min和max)。

    1. 声明列表变量:

      rainfallList = []

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

      rainfallList.append(monthlyRainfall)

    3. 毕竟,对于可以使用的循环 最小值(rainfallList) 和/或 最大值(rainfallList)

    因此,您的最终代码应该是:

    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()