Пожалуйста, обратите внимание мой ответ в качестве демонстрации Pandas (мощный данных Python анализ инструментария) модульного подхода.
Я уверен, что если вы хотите обрабатывать большое количество данных быстро - панды это ваш инструмент ...
import pandas as pd
data = [[0, 'Ealing Broadway', 103.89],
[0, 'Notting Hill Gate', 103.89],
[0, 'Mile End', 103.89],
[1, 'Ealing Broadway', 59.089999999999996],
[2, 'Notting Hill Gate', 40.279999999999994],
[3, 'Mile End', 68.86999999999999]
]
# create pandas DF
df = pd.DataFrame(data, columns=['route','interchange','length'])
Оригинал DF: группа
In [235]: df
Out[235]:
route interchange length
0 0 Ealing Broadway 103.89
1 0 Notting Hill Gate 103.89
2 0 Mile End 103.89
3 1 Ealing Broadway 59.09
4 2 Notting Hill Gate 40.28
5 3 Mile End 68.87
ДАВАЙТЕ наши данные :
In [239]: df.groupby(['route','length'])['interchange'].apply(lambda x: x.tolist()).reset_index()
Out[239]:
route length interchange
0 0 103.89 [Ealing Broadway, Notting Hill Gate, Mile End]
1 1 59.09 [Ealing Broadway]
2 2 40.28 [Notting Hill Gate]
3 3 68.87 [Mile End]
мы также можем преобразовать его в список dicts:
In [240]: df.groupby(['route','length'])['interchange'].apply(lambda x: x.tolist()).reset_index().to_dict('record')
Out[240]:
[{'interchange': ['Ealing Broadway', 'Notting Hill Gate', 'Mile End'],
'length': 103.89,
'route': 0},
{'interchange': ['Ealing Broadway'],
'length': 59.089999999999996,
'route': 1},
{'interchange': ['Notting Hill Gate'],
'length': 40.279999999999994,
'route': 2},
{'interchange': ['Mile End'], 'length': 68.86999999999999, 'route': 3}]
Сроки для 600.000 строк кадра данных на моем домашнем ноутбуке:
Установка:
In [245]: a = pd.concat([df] * 10**5)
Форма объединенного a
DF:
In [246]: a.shape
Out[246]: (600000, 3)
timeit:
In [251]: %timeit a.groupby(['route','length'])['interchange'].apply(lambda x: x.tolist()).reset_index()
10 loops, best of 3: 130 ms per loop
Не-Векторизованный подход (для петли/понимание списка/и т. д.):
In [262]: %paste
def roganjosh(lst):
new_list = []
for key, group in groupby(lst, lambda x: x[0]):
new_list.append(list(group))
main_dict = {}
for item in new_list:
main_dict[item[0][0]] = {'length': item[0][2], 'interchange': [stn[1] for stn in item]}
return main_dict
## -- End pasted text --
In [263]: lst = a.values.tolist()
In [264]: len(lst)
Out[264]: 600000
In [265]: %timeit roganjosh(lst)
1 loop, best of 3: 650 ms per loop
Всегда ли одно значение первого элемента подсети указывает одно значение в последнем элементе в подсписке? –
Я заинтригован относительно того, к чему относятся эти «длины». Длина платформы? –
0,1,2,3 можно понимать как маршрут. Название станций - это обмен в этом маршруте. Конечным значением является длина маршрута. –