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

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

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

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

Город Реги­он Феде­раль­ный округ Насе­ле­ние Осно­ва­ние Ста­тус города
1 Аба­за Хака­сия Сибир­ский 17111 1867 1966
2 Аба­кан Хака­сия Сибир­ский 165183 1734 1931
3 Абду­ли­но Орен­бург­ская область При­волж­ский 20663 1795 1923
4 Абинск Крас­но­дар­ский край Южный 34926 1863 1963
5 Аги­дель Баш­кор­то­стан При­волж­ский 16365 1980 1991
6 Агрыз Татар­стан При­волж­ский 19299 1646 1938

Зада­чу надо было решить на питоне в 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!

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



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