Как использовать функции высшего порядка с csvReader в Python - PullRequest
0 голосов
/ 21 февраля 2020

Привет. Я пытаюсь выучить функции высшего порядка (HOF) в python. Я понимаю их простое использование для уменьшения, отображения и фильтрации. Но здесь мне нужно создать кортеж станций, с которых приходили и уходили велосипеды, с числом событий на этих станциях в качестве второго значения. Теперь закомментированный код выполняется с помощью обычных функций (я оставил его как словарь, но его легко преобразовать в кортеж).

Но я какое-то время ломал голову и не могу заставить его работать, используя HOF. Моя идея сейчас заключается в том, чтобы как-то использовать map для go через csvReader и добавить в словарь. По какой-то причине я не могу понять, что здесь делать. Любая помощь в понимании того, как правильно использовать эти функции, будет полезна.

import csv

#def stations(reader):
#    Stations = {}
#    for line in reader:
#        startstation = line['start_station_name']
#        endstation = line['end_station_name']
#        Stations[startstation] = Stations.get(startstation, 0) + 1
#        Stations[endstation] = Stations.get(endstation, 0) + 1
#    return Stations
Stations = {}
def line_list(x):
    l = x['start_station_name']
    l2 = x['end_station_name']
    Stations[l] = Stations.get(l, 0) + 1
    Stations[l2] = Stations.get(l2, 0) + 1
    return dict(l,l2)
with open('citibike.csv', 'r') as fi:
    reader = csv.DictReader(fi)
    #for line in reader:
    output = list(map(line_list,reader))
    #print(listmap)

#output1[:10]
print(output)

1 Ответ

1 голос
/ 21 февраля 2020

list(map(...)) создает список результатов, а не словарь.

Если вы хотите заполнить словарь, вы можете использовать reduce(), используя словарь в качестве аккумулятора.

from functools import reduce

def line_list(Stations, x):
    l = x['start_station_name']
    l2 = x['end_station_name']
    Stations[l] = Stations.get(l, 0) + 1
    Stations[l2] = Stations.get(l2, 0) + 1
    return Stations

with open('citibike.csv', 'r') as fi:
    reader = csv.DictReader(fi)
    result = reduce(line_list, reader, {})
print(result)
...