在 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。
我非常感谢捐赠的任何专业知识。
您可以 reduce
将 dayList
放入列表 birth_years
:
reduce(lambda r, d: r + [d['birth_year']], dayList, [])
或者你可以使用理解(首选):
[d['birth_year'] for d in dayList]
我有一个包含 ~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。
我非常感谢捐赠的任何专业知识。
您可以 reduce
将 dayList
放入列表 birth_years
:
reduce(lambda r, d: r + [d['birth_year']], dayList, [])
或者你可以使用理解(首选):
[d['birth_year'] for d in dayList]