首页 > 解决方案 > 循环遍历行时记住上一行

问题描述

假设我有一个大型 CSV 文件,其中包含有关在给定日期和时间是否下雨的数据。一个玩具示例如下。

Day, Time, Rain
1, 0800, 1
1, 0818, 0
1, 0842, 1
1, 0900, 0
2, 0800, 0
2, 0822, 1
2, 0845, 1
2, 0900, 1

我希望编写可以计算一天中下雨时间比例的代码。我的计算方法如下(从当天的第二次观察开始):

  1. 如果在该观测和之前的观测之间没有下雨,那么整个时期都不算下雨。
  2. 如果在该观测和前一个观测之间下雨,则整个时段都被计为下雨
  3. 如果该观测和之前的观测中恰好有一个正在下雨,则该时段的一半被计为下雨。

例如,第 1 天下雨了 30 分钟(0800 到 0818 的一半,0818 到 0842 的一半,0842 和 0900 的一半)。第 2 天下雨了 49 分钟(从 0800 到 0822 的一半时间,从 0822 到 0900 的一半时间)。

我怎样才能在 Python 中快速做到这一点?我知道for line in file:遍历每一行,但不存储前一行的内存。

标签: pythoncsv

解决方案


我会维护一个变量来保存看到的最后一行并在每次迭代时更新它:

last_line = None
for line in lines:

    # You need to change this to explicitly check against None if line can be empty
    if not last_line:
        # Handle no last line on the first iteration

    # Use line and last_line

    # Update the last line seen
    last_line = line

您也可以last_line在开始时默认为有效值,这样就无需在循环中检查它。不过,这并不总是可行的。

可以想象还有更复杂的方法,例如lines使用其自身版本进行压缩,其中每个元素偏移一个,但这可能要简单得多。


推荐阅读