在 CSV 上使用 Python 的高阶函数

Using Python's Higher Order Functions on a CSV

我有一个包含 ~45,000 行的 csv,相当于 7 天的数据。它已按日期时间排序,最早的记录在前。

这是将 csv 传递到 csv 模块的 DictReader:

后的示例行
{'end': '423', 'g': '2', 'endid': '17131', 'slat': '40.7', 'endname': 'Horchata', 'cid': '1', 'startname': 'Sriracha', 'startid': '521', 'slon': '-73.9', 'usertype': 'Sub', 'stoptime': '2015-02-01 00:14:00+00', 'elong': '-73.9', 'starttime': '2015-02-01 00:00:00+00', 'elat': '40.7', 'dur': '801', 'meppy': '', 'birth_year': '1978'}

...还有一个:

{'end': '418', 'g': '1', 'endid': '17108', 'slat': '40.7', 'endname': 'Guacamole', 'cid': '1', 'startname': 'Cerveza', 'startid': '519', 'slon': '-73.9', 'usertype': 'Sub', 'stoptime': '2015-02-01 00:14:00+00', 'elong': '-73.9', 'starttime': '2015-02-02 00:00:00+00', 'elat': '40.7', 'dur': '980', 'meppy': '', 'birth_year': '1983'}

我最近写了下面的代码。它 运行 通过 csv(在它被传递到 DictReader 之后)。该代码会根据 starttime:

生成每个新日期的第一行,即每当日期更改时
dayList = []
def first_ride(reader):
        for row in reader:
            starttime = dateutil.parser.parse(row['starttime'])
            if starttime.day not in dayList:
                day_holder.append(starttime.day)
                yield row        
            else: 
                pass

我现在的目标是从七个记录中的每一个中生成一个包含与 birth_year 关联的值的列表,即:

[1992, 1967, 1988, 1977, 1989, 1953, 1949]

问题是我想了解如何最大程度地使用 Python 的 HOF(即 map/ reduce,并且很可能 filter),没有生成器(目前在我的代码中使用),也没有全局变量。为了消除全局变量,我的猜测是每个 starttime 的日子都必须与前一天进行比较,但不使用列表,因为我目前已经设置了它。作为最终的 FYI,我 运行 Python 2.7。

我非常感谢捐赠的任何专业知识。

您可以 reducedayList 放入列表 birth_years:

reduce(lambda r, d: r + [d['birth_year']], dayList, [])

或者你可以使用理解(首选):

[d['birth_year'] for d in dayList]