首頁 > 軟體

基於Python實現快遞資訊提取

2022-03-14 13:01:23

前言

前幾天在Python交流群裡邊,有個叫【^-^】的粉絲分享了一道Python基礎的題目,跟快遞資訊有關的,題目如下:

現在想要達到的效果如下:

一、思路

針對這個問題,首先需要讀取列表的資訊,之後對列表進行切割,獲取列表中的省或者直轄市資訊,之後再判斷省位資訊中是否包含在地址資訊中,使用列表追加的方法,進行處理,這裡經常會用到字典和列表來儲存資訊,屢試不爽。

二、解決方案

針對該問題,粉絲【^-^】給出瞭解決方法,直接上程式碼如下:

# 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([
        ['王*龍', '北京市海淀區蘇州街大恆科技大廈南座4層'],
        ['郭*峰', '河南省商丘市高新技術開發區恆宇食品廠'],
        ['趙*生', '河北省唐山市朝陽道與學院路路口融通大廈2408室'],
        ['張*', '陝西省咸陽市文匯東路6號西藏民族大學'],
        ['劉*民', '北京市大興區南海家園四里7號樓1單元902'],
        ['郭*蘭', '湖北省武漢市湖北省'],
        ['張*強', '河北省張家口市經開區鑽石南路11號'],
        ['鞠*龍', '山東省濰坊市玉清街江山帝景B區12號樓一單元14樓'],
        ['李*', '北京市海淀區西二旗智學苑5號樓超市'],
        ['許*康', '北京市西城區西單北大街甲133號'],
        ['葉*生', '江蘇省揚州市揚子江中路756號'],
        ['趙*興', '北京市海淀區西二旗上地資訊路1號金遠見大樓華緯訊301'],
        ['徐*革', '北京市海淀區閔莊路3號102棟二層206'],
        ['徐*', '安徽省淮南市金荷小區(金格商場旁)'],
        ['雷*', '北京市朝陽區望京街道望京sohoT1C座1201'],
        ['莊*', '浙江省杭州市恆生電子大廈'],
        ['蔡*恩', '湖北省武漢市仁和路沙湖港灣B區1103'],
        ['陳*', '江蘇省蘇州市巴城鎮湖濱北路193號牛吃蟹莊'],
        ['黃*', '北京市朝陽區霄雲路26號鵬潤大廈A座33層'],
        ['魏*飛', '河北省石家莊市新石北路與紅旗大街交口開元大廈502室'],
        ['張*', '山東省濟南市興港路三慶城市主人'],
        ['段*琪', '山西省臨汾市福利路堯鄉小區'],
        ['劉*', '北京市昌平區龍禧三街驪龍園601'],
        ['王*生', '上海市楊浦區邯鄲路復旦大學遺傳學樓319室'],
        ['王*君', '江蘇省揚州市葉挺路318號建行營業部'],
        ['王*義', '北京市東城區環球貿易中心D座'],
        ['韓*鑑', '北京市門頭溝區濱河路葡東小區七號樓4層D門'],
        ['羅*若', '陝西省西安市龍首北路宮園一號5號樓4單元'],
        ['王*', '北京市海淀區上地東路盈創動力大廈e座801c源清慧虹資訊科技'],
        ['馬*', '湖北省武漢市廟山中路10號名湖豪庭7棟1403'],
        ['常*峰', '山西省太原市迎新街'],
        ['侯*', '浙江省杭州市江陵路1541號'],
        ['許*娟', '上海市寶山區殷高西路高境二村177號502'],
        ['朱*', '北京市海淀區東昇鎮寶盛東路奧北科技園領智中心B座5層'],
        ['吳*峰', '湖北省武漢市幸福路鴻福花園1棟3006'],
        ['付*誠', '北京市海淀區觀林園'],
        ['滕*', '江蘇省南京市秣周東路11號雙子樓9號樓15樓君度科技'],
        ['石*剛', '遼寧省大連市大連市經濟技術開發區福泉北路20號'],
        ['程*', '北京市昌平區沙河兆豐家園'],
        ['武*', '北京市昌平區回龍觀西大街龍騰苑五區16號樓1單元202'],
        ['郭*欣', '北京市西城區阜成門 萬通新世界 B座1503']
    ])

程式碼不算多,需要花點時間去讀,不過涉及的知識點並不複雜,基本上有點Python基礎,也可以理解。程式碼執行之後,可以看到效果如下:

不過後來我在讀取這份程式碼的時候,發現中間有個地方寫的著實有些冗餘,稍微修改下,程式碼方面簡潔一些,一些函數和變數命名加了一些對應的現實意義的單詞,可讀性強了一丟丟,程式碼如下:

# 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([
        ['王*龍', '北京市海淀區蘇州街大恆科技大廈南座4層'],
        ['柴*虎', '北京市昌平區北七家鎮順瑋閣小區'],
        ['韓*', '遼寧省葫蘆島市小莊子鄉寶倉村'],
        ['魏*森', '北京市昌平區於辛莊路,賦騰國創中心,2樓'],
        ['鄧*明', '北京市豐臺區新華街三裡1號樓305'],
        ['趙*', '上海市寶山區寶山區高境鎮高境一村11號後3號車庫'],
        ['徐*亮', '北京市海淀區花園東路11號泰興大廈302'],
        ['張*凡', '北京市昌平區沙河鎮鬆蘭堡迎客家園507'],
        ['趙*', '北京市北京市海淀區農大國際創業園b區6065'],
        ['顧*天', '北京市海淀區上地東路1號華控大廈'],
        ['丁*', '上海市楊浦區安波路533弄碩和商務2號樓1102'],
        ['封*號', '江蘇省蘇州市陸家鎮陸豐東路199號水岸香堤2#2309'],
        ['王*哲', '上海市靜安區曲沃路430弄15號401'],
        ['劉**', '湖北省武漢市左嶺鎮 武漢華星光電一號門'],
        ['付*', '安徽省合肥市長江西路305號電信新技術樓'],
        ['魯*', '湖北省武漢市武大科技園宏業樓C座'],
        ['張*', '北京市朝陽區小營路13號亞非大廈7層8704室'],
        ['齊*', '湖北省武漢市珞喻路馬家莊'],
        ['王*', '北京市海淀區北塢嘉園北里9號樓三單元D01'],
        ['陳*龍', '北京市朝陽區北衛新園'],
        ['曹*生', '江蘇省無錫市澄南花苑'],
        ['沈*', '北京市海淀區中關村南大街甲18號北京國際大廈D座7層'],
        ['續*', '山西省晉中市中都廣場12層暢快車貸'],
        ['趙*全', '河北省唐山市李釗莊鎮大王莊村'],
        ['成*', '上海市虹口區東五小區641號樓2007'],
        ['方*', '上海市閔行區聯航路1399弄28號1103室'],
        ['曹*', '上海市浦東新區向城路15號24C'],
        ['韓*德', '北京市大興區棗園北里小區1號樓8單元202'],
        ['金*鵬', '浙江省溫州市溫州職業技術學院生活區快遞中心'],
        ['陶*明', '浙江省嘉興市南溪路桂苑小區23幢603'],
        ['李*ir', '北京市豐臺區南苑鄉 德鑫家園9號樓5單元50'],
        ['姜*傑', '山東省臨沂市鳳凰嶺大街惠民早餐'],
        ['l*xq', '遼寧省瀋陽市衛工南街4-4網點2門瀚辰跆拳道'],
        ['單*成', '山東省日照市日照職業技術學院'],
        ['韓*紅', '上海市楊浦區隆昌路619號10號樓二樓'],
        ['魏*琪', '北京市豐臺區漢威國際廣場4區12號樓'],
        ['楊*康', '北京市豐臺區豐臺科技園漢威廣場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)

可以得到使用者的姓名和地址資訊,如下圖所示:

之後將得到的資料可以存excel,之後通過pandas進行提取,這裡使用小小明大佬給的指導程式碼,可以提取省位,真不錯!

df['地區2']=df.地區.apply(lambda s: s[:(s in ("黑龍江省", "內蒙古自治區"))+2])

四、總結

我是Python進階者。本文實際生活中的快遞資訊,基於Python程式設計,使用Python基礎知識中的列表、字典、函數等,實現了資料資訊的提取過程。

以上就是基於Python實現快遞資訊提取的詳細內容,更多關於Python快遞資訊提取的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com