Python日常练习二

自从美赛过去后好久没玩Python了,很多函数忘了,好不熟练。因为学科作业和舍友问我些了个python的作业,打算记录一下。

Python日常练习二

这个是我舍友网上自学Python时的一个问题,常规的切片操作。

import pandas as pd
Data=pd.Series(data=['大数据','互联网',
             '技术','数据','结构化',
             '处理','难点','分析',
             '很大','合适','平台'])
x='互联网大数据技术与分析平台'

x+=' '
ans=''
while len(x)>1:
    f=0
    for i in range(-1,-len(x),-1):
        y=x[:i]
        for j in range(11):
            if y==Data[j]:
                ans+=Data[j]
                ans+='/'
                x=x[i:]
                f=1
                break
        if f==1:
            break
    if f==0:
        ans+=x[0:1]
        ans+='/'
        x=x[1:]
print(ans[:-1])

因为我逆取,最后一位涉及不到,所以加了个空字符,还能化简,但这思路简单。

Python日常练习二
读取书籍信息,统计总出版量前3的出版社:假设书名没有重复
• 使用条状图对结果进行显示
• 扩展:按年对各出版社当年的图书出版数量进行统计 2014-2019

读入中文文件时经常有不理解的编码问题,你可以用下面这个函数判断自己可以用哪种方法来读入。
上面那个是分析的链接,复制了别人的代码,讲真我只会下面这代码的方法一、三。

def open_CSV_file(file_name):
   import pandas as pd
   import csv
   try:
       f=open(file_name,'r',encoding='utf-8')
       data1=pd.read_csv(f,engine='python')
   except Exception:
       print('method1 died')
   try:
       csv_reader = csv.reader(open(file_name, encoding='utf-8'))
       data2=pd.DataFrame(csv_reader)
   except Exception:
       print('method2 died')
   try:
       data3=pd.read_csv(file_name,encoding='gbk',header=None)
   except Exception:
       print('method3 died')
   try:
       csv_reader = csv.reader(open(file_name, encoding='gbk'))
       data4=pd.DataFrame(csv_reader)
   except Exception:
       print('method4 died')
   try:
       data5=pd.read_csv(file_name,header=0,encoding='gbk',error_bad_lines=False)
   except Exception:
       print('method5 died')
   try:
       f=open(file_name,'r',encoding='ISO-8859-1')
       data6=pd.read_csv(f,engine='python')
   except Exception:
       print('method6 died')
   try:
       f=open(file_name,'r',encoding='gb18030')
       data7=pd.read_csv(f,engine='python')
   except Exception:
       print('method7 died')

open_CSV_file(r"C:\Users\沈\Desktop\book_list.csv")

自己调试了的结果。然后就可以用第三种方法读入。

Python日常练习二

根据美赛习惯,我总喜欢先输出下面这行代码

ps:不要问我为什么地址这么长,因为我懒得换目录,各个文件也是分散的,干脆复制路径了

data=pd.read_csv(r"C:\Users\沈\Desktop\book_list.csv",encoding='gbk')
print(data.describe())

毕竟数据不能这么简单分析,我还没做数据规范化,也看不出什么。

下面正文:
ps:下面这个是我同学写的,和他同时写,没他写得快,干脆用他的代码了。

import re
import pandas as pd
import matplotlib.pyplot as plt
def main():
    data=read(r'book_list.csv')
    draw(data,3)
def read(file):
    data = pd.read_csv(file,encoding='gbk')
    rows = data.shape[0]
    publisher = []
    for i in range(rows):
        name = re.findall(r"出版信息:(.*?)/.*?", data['出版社'][i])
        name = name[0].strip()
        publisher.append(name)

    dic_count = {}
    for item in publisher:
        dic_count[item] = dic_count.get(item, 0) + 1

    result = sorted(dic_count.items(), key=lambda item: item[1], reverse=True)

    return result
def draw(data,num):

    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    publisher_name = [data[i][0] for i in range(min(len(data),num))]
    publisher_name = tuple(publisher_name)
    publish_num = [data[i][1] for i in range(min(len(data),num))]
    print(publisher_name)
    print(publish_num)
    plt.bar(publisher_name,publish_num,color='r')
    plt.title('出版社出版量统计',fontsize=20)
    plt.xlabel('出版社',fontsize=16)
    plt.ylabel('出版书籍数量',fontsize=16)
    plt.show()
if __name__ == "__main__":
    main()

str.strip() : 去除字符串两边的空格(’\n’,’\t’,’ ‘,’\r’)

Python日常练习二
幸好这题只是取前三的,图可以出来。

但这代码里还是有问题的,我发现有一组样例的’出版社’是 出版信息: Marc P. Cosentino / Burgee Press / 2005-09-05。我们正则表达式是以 ‘/’ 为界限,而这个样例没有价格,前面第一个是作者,第二个才是出版社。
再如 出版信息: 邱凯生 / 2008-4 / 45.00元出版信息: Little, Brown and Company / 2008-11-18 / CAD 30.99这种不含’出版社’或’Press’的。
正则表达式需要修改。

什么你要问我价格怎么办?其实很多样例中价格的形式还是 USD +数字(美元)或其它面值(还有空值,没有单位的),得转换相同单位,而且这题没问价格相关的题,完全可以无视。

举几个特例(啊,像极了美赛时处理各种数据的时候)

出版信息:  北京联合出版公司·后浪出版公司 / 2015-6 / 36.00元
出版信息:  Ecco / 2015-5-19 / USD 28.99
出版信息:  Little, Brown and Company / 2008-11-18 / CAD 30.99
出版信息: Marc P. Cosentino / Burgee Press / 2005-09-05
出版信息:  100PAGES PRESS / 2004 / 120
出版信息:  滚石文化股份有限公司 / 1997.12 / 新台币 1800
出版信息:  机械工业出版社 / 2011年 / 48.00元
出版信息:  邱凯生 / 2008-4 / 45.00元

之后我假设:
字符中只有”press”(不区分大小写)或”出版社”的才算严格意义上的出版社,其他个人名义或公司名义的不算。

复习一下:

re函数:compile、match、search、findall的区别

要注意以下几点:
1、数量词的贪婪模式与非贪婪模式
2、反斜杠的运用
3、匹配模式

于是正则表达式改成下面这两种,分别匹配中文和英文的情况。

`python
a=’出版信息: 滚石文化股份有限公司 / 1997.12 / 新台币 1800′
b=’出版信息: 机械工业出版社 / 2011年 / 48.00元’
x=’出版信息: Marc P. Cosentino / Burgee Press / 2005-09-05′
y=’出版信息: 100PAGES PRESS / 2004 / 120′
regex1=re.compile(r'(\w+\s+press)’,re.I)
regex2=re.compile(r'([\u4e00-\u9fff]+出版社)’)
print(regex1.findall(x))
print(regex2.findall(b))

Original: https://blog.csdn.net/weixin_45606191/article/details/115433047
Author: 蒲公英之殇
Title: Python日常练习二

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/755969/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球