在CSV上使用Python的高阶函数

时间:2016-02-21 16:59:02

标签: python csv higher-order-functions

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

将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。

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

1 个答案:

答案 0 :(得分:1)

您可以reducedayList改为birth_years列表:

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

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

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