【问题标题】:How to show the day with the lowest spread in temp lowest如何显示温度最低价差最低的一天
【发布时间】:2021-09-04 01:24:59
【问题描述】:

作为新程序员解决问题。问题是在 weather.csv 中,您会找到每日天气数据。编写程序读取文件,然后输出温度分布最小的天数(第一列)(第二列最高温度,第三列最低)。

我在这里公开了weather.csv文件https://docs.google.com/spreadsheets/d/1fMxCY_CdpdhDjMZZWGzyh-whEvZYxH2XiBfA4AfqZJw/edit#gid=0的列表

我尝试对列表进行排序,我尝试打印 min(day_spread),它返回“TypeError: 'int' object is not iterable”。我完全不知道从这里到哪里使用我的代码。谢谢!

编辑:我添加了 tot_spread 并将 day 设为 int。

import csv


with open("weather.csv", 'r') as infile:
    reader = csv.reader(infile, delimiter=',')
    header = next(reader)
    for row in reader:
        day = int(row[0])
        max_weather = int(row[1])
        min_weather = int(row[2])
        day_spread = (max_weather - min_weather)
        tot_spread = [day, day_spread]
        print(min(tot_spread)

【问题讨论】:

  • 你快到了。问题是,day_spread 只是一个数字,但min() 将一个列表作为输入,并为您提供该列表中的最小值。
  • 有道理,我添加了这个 tot_spread = [day, day_spread] print(min(tot_spread)) 但现在它打印了所有天,所以,我不认为我把它列在列表中,如果我是正确的?它是 4 个单独的列表?我还把 day 改成了 int
  • 好的,我的意思是暗示reader 是一个可迭代的(几乎是一个列表)。这是正确的方向,但让我发布一个答案(我不想引起更多混乱)

标签: python csv parsing


【解决方案1】:

您可以使用min 的路线,但您仍然需要列出 您所有的日/价差对,然后返回该列表中的最小值。

import csv

spreads = [] # list for all values

with open("weather.csv", 'r') as infile:
    reader = csv.reader(infile, delimiter=',')
    header = next(reader)
    for row in reader:
        day = int(row[0])
        max_weather = int(row[1])
        min_weather = int(row[2])
        day_spread = (max_weather - min_weather)
        tot_spread = [day, day_spread]
        spreads.append(tot_spread) # add the pair to the list

# print the minimum
print(min(spreads, key=lambda x:x[1]))

key=lambda x:x[1] 告诉 min 根据每对的第二个值(即点差)返回最小值。

作为替代方案,您可以存储当前最小值,并且对于每次迭代, 检查新值是否低于当前值。如果您还不知道lambda 等,这可能更容易理解:

import csv

min_spread = 99999 # some ridiculously high value
min_day = -1 # doesn't really matter what value

with open("weather.csv", 'r') as infile:
    reader = csv.reader(infile, delimiter=',')
    header = next(reader)
    for row in reader:
        day = int(row[0])
        max_weather = int(row[1])
        min_weather = int(row[2])
        day_spread = (max_weather - min_weather)

        # if the new value is lower than the current minimum,
        # take it as the new minimum
        if day_spread < min_spread:
            min_spread = day_spread
            min_day = day

# print the minimum
print(min_day)

【讨论】:

  • 第二个选项对我来说肯定更容易理解,因为我还没有学习 lambda,但现在我有一些新东西要学。非常感谢您的帮助!
猜你喜欢
  • 2012-10-14
  • 2015-09-30
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2014-09-09
相关资源
最近更新 更多