【问题标题】:Python: Trying to create two functions. One iterates through the columns of a 2d list, while the other goes through the rowsPython:尝试创建两个函数。一个遍历二维列表的列,而另一个遍历行
【发布时间】:2016-08-09 06:58:20
【问题描述】:
def average_hour (temps, hour):
      i = 0
      for i in temps[None][i]:
            total = total + temps[None][i]
      average = total/(i+1)
      return average

def average_day (temps, day):
      i = 0
      for i in temps[i][None]:
            total = total + temps[i][None]
      average = total/(i+1)
      return average      

def main():
      temps = [
      [73.0, 73.9, 73.0, 73.9, 73.9, 73.9, 73.0, 71.1, 71.1, 71.1, 70.0, 70.0, 70.0, 70.0, 70.0, 71.1, 71.1, 71.6, 71.1, 71.1, 70.0, 71.1, 70.0, 71.1],
      [63.0, 63.0, 62.1, 62.1, 62.1, 62.1, 62.1, 62.1, 62.1, 62.1, 62.1, 62.1, 62.1, 62.1, 61.0, 62.6, 62.6, 62.1, 62.1, 62.1, 62.1, 62.1, 62.1, 62.1],
      [68.0, 68.0, 69.1, 69.1, 69.1, 73.9, 75.0, 75.9, 81.0, 81.0, 82.0, 84.0, 80.1, 78.1, 75.9, 77.0, 80.1, 81.0, 82.0, 81.0, 81.0, 79.0, 78.1, 78.1],
      [78.1, 78.1, 78.1, 77.0, 77.0, 77.0, 75.9, 75.0, 75.2, 75.9, 73.9, 73.9, 73.9, 73.0, 73.0, 73.0, 73.9, 73.9, 73.0, 73.4, 73.0, 73.0, 75.0, 75.0],
      [71.1, 71.1, 70.0, 70.0, 70.0, 70.0, 70.0, 70.0, 70.0, 70.0, 69.1, 69.1, 69.1, 69.1, 68.0, 66.9, 66.0, 66.0, 66.0, 66.0, 66.0, 66.0, 64.9, 64.9],
      [61.0, 61.0, 61.0, 61.0, 61.0, 61.0, 60.1, 60.1, 60.1, 60.1, 60.1, 60.1, 60.1, 60.1, 60.1, 60.1, 60.1, 60.1, 60.1, 61.0, 61.0, 61.0, 64.9, 64.9],
      [57.0, 55.0, 55.0, 55.0, 54.0, 54.0, 55.0, 54.0, 55.0, 55.9, 55.9, 55.0, 55.0, 57.0, 62.1, 66.9, 71.1, 73.0, 75.0, 77.0, 78.1, 78.1, 78.1, 75.9],
      [62.1, 61.0, 61.0, 60.1, 60.1, 59.0, 59.0, 61.0, 66.9, 72.0, 75.9, 78.1, 78.1, 78.1, 78.1, 78.1, 77.0, 75.0, 72.0, 71.1, 70.0, 68.0, 66.0, 64.0],
      [63.0, 62.1, 61.0, 61.0, 59.0, 60.1, 59.0, 60.1, 66.9, 73.9, 75.9, 78.1, 81.0, 79.0, 81.0, 79.0, 79.0, 75.9, 73.0, 72.0, 71.1, 71.1, 71.1, 70.0],
      [70.0, 69.1, 70.0, 69.1, 69.1, 69.1, 69.1, 69.1, 68.0, 68.0, 68.0, 70.0, 69.8, 70.0, 70.0, 70.0, 71.1, 70.0, 70.0, 71.1, 71.1, 71.1, 73.0, 73.0],
      [61.0, 61.0, 60.1, 59.0, 59.0, 59.0, 57.9, 59.0, 59.0, 60.1, 61.0, 61.0, 63.0, 66.9, 66.0, 71.1, 71.1, 73.9, 72.0, 75.9, 75.0, 75.9, 75.9, 75.0],
      [62.1, 62.1, 62.1, 61.0, 62.1, 61.0, 62.1, 62.1, 63.0, 62.1, 61.0, 61.0, 61.0, 61.0, 64.0, 64.9, 66.0, 66.0, 68.0, 70.0, 66.0, 64.0, 62.1, 62.1],
      [63.0, 63.0, 64.0, 64.0, 64.9, 63.0, 63.0, 64.0, 68.0, 72.0, 75.0, 77.0, 79.0, 79.0, 79.0, 79.0, 78.1, 75.9, 73.0, 72.0, 71.1, 71.1, 70.0, 69.1],
      [69.1, 68.0, 66.0, 66.0, 64.9, 64.0, 64.0, 63.0, 63.0, 64.0, 64.0, 64.0, 64.9, 68.0, 73.0, 75.0, 77.0, 79.0, 80.1, 80.1, 79.0, 77.0, 71.1, 64.0],
      [57.9, 57.9, 59.0, 59.0, 57.0, 55.9, 55.0, 55.0, 60.1, 64.9, 70.0, 73.0, 73.0, 73.9, 75.0, 73.9, 75.0, 72.0, 61.0, 57.0, 55.9, 54.0, 53.1, 53.1],
      [53.1, 53.1, 52.0, 52.0, 51.1, 51.1, 54.0, 55.0, 64.0, 69.1, 73.0, 77.0, 79.0, 81.0, 81.0, 81.0, 78.1, 75.0, 73.0, 72.0, 68.0, 66.9, 66.0, 66.0],
      [62.1, 61.0, 57.9, 57.0, 57.0, 55.0, 54.0, 54.0, 57.0, 63.0, 66.0, 66.9, 70.0, 72.0, 72.0, 72.0, 71.1, 68.0, 63.0, 57.9, 59.0, 55.0, 55.0, 53.1],
      [53.1, 51.1, 48.9, 48.0, 46.9, 45.0, 44.1, 45.0, 48.0, 51.1, 54.0, 55.0, 55.9, 57.9, 59.0, 60.1, 59.0, 57.0, 52.0, 46.9, 46.0, 43.0, 45.0, 42.1],
      [42.1, 39.9, 39.9, 39.9, 39.9, 39.0, 37.9, 39.9, 45.0, 50.0, 55.0, 57.0, 59.0, 60.1, 61.0, 61.0, 61.0, 57.9, 52.0, 48.0, 46.9, 45.0, 45.0, 45.0],
      [45.0, 43.0, 43.0, 43.0, 42.1, 42.1, 42.1, 43.0, 52.0, 57.0, 61.0, 64.0, 68.0, 70.0, 71.1, 70.0, 69.1, 66.9, 62.1, 57.0, 54.0, 54.0, 53.1, 52.0],
      [51.1, 50.0, 50.0, 51.1, 51.1, 51.1, 50.0, 52.0, 57.9, 64.0, 70.0, 73.0, 75.0, 75.0, 75.9, 75.0, 73.0, 70.0, 66.9, 63.0, 62.1, 60.1, 60.8, 61.0],
      [55.9, 57.0, 57.0, 57.0, 57.0, 57.0, 55.9, 55.0, 55.0, 55.0, 55.0, 55.0, 55.0, 54.0, 54.0, 54.0, 54.0, 54.0, 54.0, 54.0, 54.0, 54.0, 53.1, 53.1],
      [57.0, 55.9, 55.0, 54.0, 54.0, 53.1, 53.1, 54.0, 54.0, 53.1, 54.0, 54.0, 54.0, 54.0, 54.0, 54.0, 54.0, 53.1, 53.1, 53.1, 62.1, 68.0, 73.0, 77.0],
      [63.0, 59.0, 57.9, 57.9, 55.9, 55.9, 55.0, 55.9, 60.1, 63.0, 66.0, 69.1, 72.0, 72.0, 73.9, 73.0, 70.0, 68.0, 64.0, 61.0, 59.0, 61.0, 57.9, 57.9],
      [55.9, 55.9, 55.0, 55.0, 54.0, 55.0, 55.0, 55.0, 55.0, 55.0, 55.0, 55.9, 57.0, 57.0, 57.9, 61.0, 64.0, 68.0, 73.0, 75.9, 78.1, 78.1, 77.0, 78.1],
      [64.9, 66.0, 64.9, 64.0, 64.0, 63.0, 61.0, 61.0, 61.0, 61.0, 63.0, 66.9, 64.0, 66.0, 64.0, 64.0, 64.0, 62.1, 61.0, 60.1, 59.0, 57.9, 57.9, 57.9],
      [57.9, 57.9, 57.9, 57.9, 57.9, 57.9, 57.0, 57.9, 59.0, 60.1, 59.0, 60.1, 60.1, 61.0, 63.0, 64.9, 66.0, 66.0, 66.0, 66.0, 66.9, 66.9, 66.0, 66.0],
      [70.0, 70.0, 71.1, 71.1, 71.1, 71.1, 70.0, 70.0, 69.1, 71.1, 71.1, 73.0, 73.9, 75.9, 77.0, 73.9, 73.0, 72.0, 72.0, 72.0, 72.0, 72.0, 72.0, 72.0],
      [72.0, 71.1, 71.1, 71.1, 70.0, 68.0, 68.0, 68.0, 66.2, 66.9, 66.0, 66.0, 69.1, 70.0, 70.0, 73.0, 73.9, 75.9, 77.0, 79.0, 78.1, 75.0, 72.0, 69.1],
      [66.9, 66.0, 66.0, 66.0, 66.0, 64.9, 64.0, 63.0, 64.0, 66.0, 69.1, 71.1, 73.0, 73.0, 73.0, 73.9, 73.0, 70.0, 61.0, 59.0, 57.0, 55.9, 54.0, 53.1],
      [51.1, 51.1, 51.1, 51.1, 51.1, 52.0, 51.1, 51.1, 54.0, 60.1, 64.0, 66.0, 68.0, 69.1, 68.0, 68.0, 66.9, 64.9, 63.0, 60.1, 59.0, 60.1, 57.9, 57.0]
      ]

      print("Average Hour:", average_hour(temps, 0)) # Should be ~61.3
      print("Average Day:", average_day(temps, 0))  # Should be ~71.5

我参考main() 来测试它。最后告诉我TypeError: list indices must be integers or slices, not NoneType

那么,什么是合适的占位符而不是None?另外,我做for循环对吗?

请告诉我。新手在这里(因为它本质上是显而易见的)。

【问题讨论】:

  • temps[i][None] 应该做什么? None 怎么可能是索引?
  • @PadraicCunningham 是的,但是“无”的占位符应该是什么?
  • 您也没有声明总计、使用的小时或天,小时和天如何符合您的逻辑?
  • dayhour参数的作用是什么?
  • 好的,我可以在average_houraverage_day的开头写total = 0吗?

标签: python arrays python-3.x for-loop multidimensional-array


【解决方案1】:

您确实使用None 作为索引。相反,对于average_hour,您应该遍历固定日期的所有时间(而不是无)。 average_day 类似:

def average_hour(temps, hour):
    total = 0
    for day in temps:  # each row is a day (list of hours)
        total += day[hour]  # take specified hour from each row (day)
    average = total / len(temps)
    return average

def average_day(temps, day):
    total = 0
    for hour in temps[day]:  # just iterate over the specified row (aka day)
        total += hour
    average = total / len(temps[day])
    return average

> print(average_hour(temps, 0))
> print(average_day(temps, 0))

61.3064516129
71.5041666667

正如 cmets 中所述,有一些方法可以缩短它。一种更易读的方式使用list-comprehension(或@PadraicCunningham 指出的底层generator-expression),例如:

def average_hour(temps, hour):
    days = [day[hour] for day in temps]
    return sum(days)/len(days)
    # or even shorter: return sum(day[hour] for day in temps)/len(temps)

def average_day(temps, day):
    return sum(temps[day])/len(temps[day])

【讨论】:

  • 好的。这样可行。现在我的问题,所以我正确理解这一点!那么为什么for dayaverage_hour 函数中和for houraverage_day 函数中呢?另外,+= 有什么作用?
  • sum(row[day] for row in temps) / len(temps)
  • for thing in things 是迭代可迭代对象(例如 list)的元素的 Python 方式。 x += yx = x + y 的快捷方式
  • @schwobaseggl 是的,我知道我们正在迭代。但是我们为什么要使用本质上的对立面。就像我们在 day 函数中使用 hour 一样。还有,好吧。 += 现在有意义了。
  • @PadraicCunningham 考虑到临时 (31) 及其行 (24) 的长度,sum(temps[day]) / len(temps[day]) 似乎更有可能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
相关资源
最近更新 更多