社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

手把手教你使用Python提取快递信息

Python爱好者社区 • 4 年前 • 325 次点击  
前言

前几天在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.*?)', '(?P
.*?)'\]"
, 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基础知识中的列表、字典、函数等,实现了数据信息的提取过程。

最后感谢粉丝【^-^】的分享,感谢【小小明】大佬提供的pandas处理方法。这个问题肯定小编相信肯定还有其他的方法的,也欢迎大家在评论区谏言。

小伙伴们,快快用实践一下吧!

--- EOF ---
推荐↓↓↓

整理不易,请点赞和在看
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/128859