手把手教你使用Python提取快遞信息
回復“書籍”即可獲贈Python從入門到進階共10本電子書
大家好,我是Python進階者。
前言
前幾天在Python交流群里邊,有個叫【^-^】的粉絲分享了一道Python基礎的題目,跟快遞信息有關的,題目如下:
現(xiàn)在想要達到的效果如下:

一、思路
針對這個問題,首先需要讀取列表的信息,之后對列表進行切割,獲取列表中的省或者直轄市信息,之后再判斷省位信息中是否包含在地址信息中,使用列表追加的方法,進行處理,這里經常會用到字典和列表來存儲信息,屢試不爽。
二、解決方案
針對該問題,粉絲【^-^】給出了解決方法,直接上代碼如下:
# coding: utf-8
def sp(s):
citys = []
dizhi = []
dice = {}
dic = {}
for i in s:
# print(i)
a = i[1]
city = a[0:2]
zlib = a[0:2]
citys.append(city)
dizhi.append(zlib)
cityss = set(citys) # 去重
citysss = list(cityss) # 轉為列表
d = dice.fromkeys(citysss)
for key in d:
h = []
for j in s:
b = j[1]
lgezi = b[0:2]
if lgezi == key:
h.append(j)
dic[key] = h
# print(dic)
for key in dic:
# 遍歷字典
print(key, dic[key])
if __name__ == '__main__':
sp([
['王*龍', '北京市海淀區(qū)蘇州街大恒科技大廈南座4層'],
['郭*峰', '河南省商丘市高新技術開發(fā)區(qū)恒宇食品廠'],
['趙*生', '河北省唐山市朝陽道與學院路路口融通大廈2408室'],
['張*', '陜西省咸陽市文匯東路6號西藏民族大學'],
['劉*民', '北京市大興區(qū)南海家園四里7號樓1單元902'],
['郭*蘭', '湖北省武漢市湖北省'],
['張*強', '河北省張家口市經開區(qū)鉆石南路11號'],
['鞠*龍', '山東省濰坊市玉清街江山帝景B區(qū)12號樓一單元14樓'],
['李*', '北京市海淀區(qū)西二旗智學苑5號樓超市'],
['許*康', '北京市西城區(qū)西單北大街甲133號'],
['葉*生', '江蘇省揚州市揚子江中路756號'],
['趙*興', '北京市海淀區(qū)西二旗上地信息路1號金遠見大樓華緯訊301'],
['徐*革', '北京市海淀區(qū)閔莊路3號102棟二層206'],
['徐*', '安徽省淮南市金荷小區(qū)(金格商場旁)'],
['雷*', '北京市朝陽區(qū)望京街道望京sohoT1C座1201'],
['莊*', '浙江省杭州市恒生電子大廈'],
['蔡*恩', '湖北省武漢市仁和路沙湖港灣B區(qū)1103'],
['陳*', '江蘇省蘇州市巴城鎮(zhèn)湖濱北路193號牛吃蟹莊'],
['黃*', '北京市朝陽區(qū)霄云路26號鵬潤大廈A座33層'],
['魏*飛', '河北省石家莊市新石北路與紅旗大街交口開元大廈502室'],
['張*', '山東省濟南市興港路三慶城市主人'],
['段*琪', '山西省臨汾市福利路堯鄉(xiāng)小區(qū)'],
['劉*', '北京市昌平區(qū)龍禧三街驪龍園601'],
['王*生', '上海市楊浦區(qū)邯鄲路復旦大學遺傳學樓319室'],
['王*君', '江蘇省揚州市葉挺路318號建行營業(yè)部'],
['王*義', '北京市東城區(qū)環(huán)球貿易中心D座'],
['韓*鑒', '北京市門頭溝區(qū)濱河路葡東小區(qū)七號樓4層D門'],
['羅*若', '陜西省西安市龍首北路宮園一號5號樓4單元'],
['王*', '北京市海淀區(qū)上地東路盈創(chuàng)動力大廈e座801c源清慧虹信息科技'],
['馬*', '湖北省武漢市廟山中路10號名湖豪庭7棟1403'],
['常*峰', '山西省太原市迎新街'],
['侯*', '浙江省杭州市江陵路1541號'],
['許*娟', '上海市寶山區(qū)殷高西路高境二村177號502'],
['朱*', '北京市海淀區(qū)東升鎮(zhèn)寶盛東路奧北科技園領智中心B座5層'],
['吳*峰', '湖北省武漢市幸福路鴻福花園1棟3006'],
['付*誠', '北京市海淀區(qū)觀林園'],
['滕*', '江蘇省南京市秣周東路11號雙子樓9號樓15樓君度科技'],
['石*剛', '遼寧省大連市大連市經濟技術開發(fā)區(qū)福泉北路20號'],
['程*', '北京市昌平區(qū)沙河兆豐家園'],
['武*', '北京市昌平區(qū)回龍觀西大街龍騰苑五區(qū)16號樓1單元202'],
['郭*欣', '北京市西城區(qū)阜成門 萬通新世界 B座1503']
])
代碼不算多,需要花點時間去讀,不過涉及的知識點并不復雜,基本上有點Python基礎,也可以理解。代碼運行之后,可以看到效果如下:

不過后來我在讀取這份代碼的時候,發(fā)現(xiàn)中間有個地方寫的著實有些冗余,稍微修改下,代碼方面簡潔一些,一些函數(shù)和變量命名加了一些對應的現(xiàn)實意義的單詞,可讀性強了一丟丟,代碼如下:
# coding: utf-8
def sp(text):
city = []
dice = {}
dic = {}
address = [info[-1] for info in text]
for city_info in address:
city.append(city_info[0:2])
cities = list(set(city)) # 先去重,然后轉為列表
# print(cities)
dict_keys = dice.fromkeys(cities)
for key in dict_keys:
h = []
for info in text:
address = info[-1]
city_info = address[0:2]
if city_info == key:
h.append(info)
dic[key] = h
# print(dic)
for key in dic:
# 遍歷字典
print(key, dic[key])
if __name__ == '__main__':
sp([
['王*龍', '北京市海淀區(qū)蘇州街大恒科技大廈南座4層'],
['柴*虎', '北京市昌平區(qū)北七家鎮(zhèn)順瑋閣小區(qū)'],
['韓*', '遼寧省葫蘆島市小莊子鄉(xiāng)寶倉村'],
['魏*森', '北京市昌平區(qū)于辛莊路,賦騰國創(chuàng)中心,2樓'],
['鄧*明', '北京市豐臺區(qū)新華街三里1號樓305'],
['趙*', '上海市寶山區(qū)寶山區(qū)高境鎮(zhèn)高境一村11號后3號車庫'],
['徐*亮', '北京市海淀區(qū)花園東路11號泰興大廈302'],
['張*凡', '北京市昌平區(qū)沙河鎮(zhèn)松蘭堡迎客家園507'],
['趙*', '北京市北京市海淀區(qū)農大國際創(chuàng)業(yè)園b區(qū)6065'],
['顧*天', '北京市海淀區(qū)上地東路1號華控大廈'],
['丁*', '上海市楊浦區(qū)安波路533弄碩和商務2號樓1102'],
['封*號', '江蘇省蘇州市陸家鎮(zhèn)陸豐東路199號水岸香堤2#2309'],
['王*哲', '上海市靜安區(qū)曲沃路430弄15號401'],
['劉**', '湖北省武漢市左嶺鎮(zhèn) 武漢華星光電一號門'],
['付*', '安徽省合肥市長江西路305號電信新技術樓'],
['魯*', '湖北省武漢市武大科技園宏業(yè)樓C座'],
['張*', '北京市朝陽區(qū)小營路13號亞非大廈7層8704室'],
['齊*', '湖北省武漢市珞喻路馬家莊'],
['王*', '北京市海淀區(qū)北塢嘉園北里9號樓三單元D01'],
['陳*龍', '北京市朝陽區(qū)北衛(wèi)新園'],
['曹*生', '江蘇省無錫市澄南花苑'],
['沈*', '北京市海淀區(qū)中關村南大街甲18號北京國際大廈D座7層'],
['續(xù)*', '山西省晉中市中都廣場12層暢快車貸'],
['趙*全', '河北省唐山市李釗莊鎮(zhèn)大王莊村'],
['成*', '上海市虹口區(qū)東五小區(qū)641號樓2007'],
['方*', '上海市閔行區(qū)聯(lián)航路1399弄28號1103室'],
['曹*', '上海市浦東新區(qū)向城路15號24C'],
['韓*德', '北京市大興區(qū)棗園北里小區(qū)1號樓8單元202'],
['金*鵬', '浙江省溫州市溫州職業(yè)技術學院生活區(qū)快遞中心'],
['陶*明', '浙江省嘉興市南溪路桂苑小區(qū)23幢603'],
['李*ir', '北京市豐臺區(qū)南苑鄉(xiāng) 德鑫家園9號樓5單元50'],
['姜*杰', '山東省臨沂市鳳凰嶺大街惠民早餐'],
['l*xq', '遼寧省沈陽市衛(wèi)工南街4-4網(wǎng)點2門瀚辰跆拳道'],
['單*成', '山東省日照市日照職業(yè)技術學院'],
['韓*紅', '上海市楊浦區(qū)隆昌路619號10號樓二樓'],
['魏*琪', '北京市豐臺區(qū)漢威國際廣場4區(qū)12號樓'],
['楊*康', '北京市豐臺區(qū)豐臺科技園漢威廣場12棟'],
])
三、小小花絮
這里其實還可以通過正則表達式來做地址信息的提取,代碼如下:
with open("地址信息.txt", 'r', encoding='utf-8') as f:
for line in f:
content = re.compile(r"\['(?P<name>.*?)', '(?P<address>.*?)'\]", re.S)
result = content.finditer(line)
for i in result:
name = i.group("name")
address = i.group("address")
print(name, address)
可以得到用戶的姓名和地址信息,如下圖所示:

之后將得到的數(shù)據(jù)可以存excel,之后通過pandas進行提取,這里使用小小明大佬給的指導代碼,可以提取省位,真不錯!
df['地區(qū)2']=df.地區(qū).apply(lambda s: s[:(s in ("黑龍江省", "內蒙古自治區(qū)"))+2])

四、總結
我是Python進階者。本文實際生活中的快遞信息,基于Python編程,使用Python基礎知識中的列表、字典、函數(shù)等,實現(xiàn)了數(shù)據(jù)信息的提取過程。
最后感謝粉絲【^-^】的分享,感謝【小小明】大佬提供的pandas處理方法。這個問題肯定小編相信肯定還有其他的方法的,也歡迎大家在評論區(qū)諫言。
小伙伴們,快快用實踐一下吧!如果在學習過程中,有遇到任何問題,歡迎加我好友,我拉你進Python學習交流群共同探討學習。

小伙伴們,快快用實踐一下吧!如果在學習過程中,有遇到任何問題,歡迎加我好友,我拉你進Python學習交流群共同探討學習。
------------------- End -------------------
往期精彩文章推薦:

歡迎大家點贊,留言,轉發(fā),轉載,感謝大家的相伴與支持
想加入Python學習群請在后臺回復【入群】
萬水千山總是情,點個【在看】行不行
/今日留言主題/
隨便說一兩句吧~~
