blog/

Как посчитать что-то из таблицы с помощью Python

Ivan @ 07 / 06 / 2020 @ Blog / Памятки / Программирование
( / / )

Время чтения: ~ 4 мин.

Вчера пришлось разобраться с одним заданием для одного воркшопа. В качестве задания была таблица вида:

ГородРегионФедеральный округНаселениеОснованиеСтатус города
1АбазаХакасияСибирский1711118671966
2АбаканХакасияСибирский16518317341931
3АбдулиноОренбургская областьПриволжский2066317951923
4АбинскКраснодарский крайЮжный3492618631963
5АгидельБашкортостанПриволжский1636519801991
6АгрызТатарстанПриволжский1929916461938

Задачу надо было решить на питоне в colab.research.google.com. Надо было посчитать, сколько городов в таблице основаны в 17 веке. Сложность была в том, что основание там указывалось в разном формате: где-то «16хх», где-то «XVII что-то».

Сначала накрутил какую-то мутную схему с двумя вложенными циклами и вознёй с питоновскими списками, и сравнением списка нужных дат со списком фактических дат. И всё это было адски громоздко, замудрёно, и тяжело для восприятия, особенно в контексте моего перехода с JS на Питон. Кроме того, список исключений — ещё та муть, который составлять было очень долго и некогда, поскольку это задание было выдано в последний момент перед дедлайном. А ещё мутно и на коленке написанные тетрадки от организаторов только ухудшали ситуацию. Конечно, как обычно, несмотря на то, что я уложился в дедлайн, и алгорим был верен, заявку отклонили, поскольку уже набрали группы. Ну это и к лучшему.

Зато потом, спустя полчаса, внезапно вспомнил про регулярные выражения, и код уменьшился втрое:

#from google.colab import files
import requests 
import re
import pandas as pd
data = pd.read_csv('cities.csv')

d = data ['Основание']
d = d.values.tolist()
number=len(re.findall(r"('16..')|(XVII\s)", str(d)))
print (number)

Тут подключаются библиотеки requests, re, pandas, files (впрочем, files — не нужны тут, поскольку именно работы с файлами на уровне потоков ввода/вывода тут не будет, эта строчка за каким-то рожном была предложена организаторами). Pandas — дают инструменты для гибкой работы с таблицами, re — regex. При этом, в пандавской функции read_csv можно задавать не только локальные пути к файлу, но и полные url c http/s. Осталось только воткнуть в метод re.findall r»(’16..’)|(XVII\s)» и перевести список в строку str(d) (findall принимает только строки вторым аргументом).


Может быть интересно:


Подпишитесь на нас в социальных сетях!

Instagram
VK
Facebook
YouTube!
Telegram!

Подпишитесь на обновления



* нажимая на кнопку «Подписаться», вы даете согласие на обработку своих персональных данных