Использование скрипта Python для создания списка словарей, просматривая данные файла csv

У меня есть данные в формате

from        to
Location1   Location2
Location1   Location3
Location1   Location4
Location1   Location5

Location2   Location1
Location2   Location3

Location3   Location1
Location3   Location2
Location3   Location4

В CSV-файле. Эти данные отображают поездки на велосипеде от одной станции к другой и взяты с веб-сайта компании по прокату велосипедов в Чикаго.

Прямо сейчас у меня есть базовый код, который берет каждую строку и добавляет ее в список, но не создает словарь во втором индексе, как я хотел. Мой сценарий выглядит так:

import csv
li = []
with open('Desktop/test_Q4_trips.csv', newline='') as csvfile:
reader = csv.reader(csvfile, delimiter=',')
for name, imports in reader:
    li.append({
        "name": name,
        "imports": imports,
    })
del li[0]

Вот результат,

[{"from": "Location1", "to": "Location2"}, {"from": "Location1", "to": "Location3"},
{"from": "Location1", "to": "Location4"}, {"from": "Location1", "to": "Location5"}, 
...]

Я хочу преобразовать эти данные в этот формат,

[{"from": "Location1", "to": ["Location2", "Location3", "Location4", "Location5"]},
    {"from": "Location2", "to": ["Location1", "Location3"]},
    {"from": "Location3", "to": ["Location1", "Location2", "Location4"]}, ...
].

Проще говоря, я хотел бы создать список словарей, в котором каждый словарь имеет одно значение в первом индексе и список (переменное множество) значений во втором индексе. В частности, в выходных данных должны быть перечислены все станции, принимающие прокат велосипедов, в списке во втором индексе. Чтобы сделать это, я полагаю, мне нужно будет создать сценарий с циклом for, который перебирает значения «from» слева и добавляет каждое местоположение «to», которое соответствует каждому «from», в список.

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

Пожалуйста, помогите мне решить эту проблему, заранее спасибо.

Я не думаю, что у формата, который вы опубликовали, есть разделитель как ','.

Emmanuel Mtali 24.08.2018 04:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
43
2

Ответы 2

collections.defaultdict может быть хорошим подходом для решения этой проблемы.

from collections import defaultdict


d = defaultdict(list)

a = [{"from": "Location1", "to": "Location2"}, {"from": "Location1", "to": "Location3"},
     {"from": "Location1", "to": "Location4"}, {"from": "Location1", "to": "Location5"}]


for o in a:
    d[o['from']].append(o['to'])

print(d)

Это дает выход [{"Location1": ["Location2", "Location3", "Location4", "Location5"]}], а не [{"from": "Location1", "to": ["Location2", "Location3", "Location4", "Location5"]}]. Есть идеи, как мне добавить «от» и «до» в словарь? Спасибо.

Ashok B. Raife 24.08.2018 21:46

Ой, извините, просто добавьте следующую строку: res = [{"from": k, "to": v} for k, v in d.items()] в конец, @ AshokB.Raife

leotrubach 25.08.2018 10:48

Большой. Последний вопрос: как мне удалить дублирующиеся выходные данные, например, если маршрут поездки указан в данных дважды, но я хочу, чтобы в столбце «Кому» выходного файла была только одна запись?

Ashok B. Raife 25.08.2018 15:39

В этом случае лучше использовать набор вместо списка. Таким образом, вы используете d = defaultdict(set) вместо list и d[o['from']].add(o['to']) вместо append().

leotrubach 25.08.2018 18:57

Я думаю, это должно сработать

import numpy as np
l = [{"from": "Location1", "to": "Location2"}, {"from": "Location1", "to": "Location3"},
 {"from": "Location1", "to": "Location4"}, {"from": "Location1", "to": "Location5"}]

from_to = np.array(([d['from'] for d in l],[d['to'] for d in l])).T
froms = set(from_to[:,0])

out = []
for f in froms: 
    d = {}
    mask = from_to[:,0]==f
    d['from']=f
    d['to'] = from_to[:,1][mask]
    out.append(d)

Другие вопросы по теме