python 第三周作业

1、给出任意一个列表,请查找出x元素是否在列表里面,如果存在返回1,不存在返回0python 第三周作业_第1张图片

2、任一个英文的纯文本文件,统计其中的单词出现的个数。

s =""" Accessing Text from the Web and from Disk

Electronic Books
A small sample of texts from Project Gutenberg appears in the NLTK corpus collection. However, you may be interested in analyzing other texts from Project Gutenberg. You can browse the catalog of 25,000 free online books at http://www.gutenberg.org/catalog/, and obtain a URL to an ASCII text file. Although 90% of the texts in Project Gutenberg are in English, it includes material in over 50 other languages, including Catalan, Chinese, Dutch, Finnish, French, German, Italian, """
word=[]#存储单词   
#因为原文中每个单词都是用空格 或者逗号加空格分开的,  
line=s.replace(',','')#除去逗号只要空格来分开单词  
line=s.strip()  
wo=line.split(' ')  
word.extend(wo)  
#去除重复的值  
wokey={}
#word作为键值,VAUE为空值
wokey=wokey.fromkeys(word)
word_1=list(wokey.keys())
#然后统计单词出现的次数,并将它存入一个字典中  
for i in word_1:  
    wokey[i]=word.count(i)
print (wokey)
#排序,按values进行排序,如果是按key进行排序用sorted(wokey.items(),key=lambda d:d[0],reverse=True)  
wokey_1={}  
wokey_1=sorted(wokey.items(),key=lambda d:d[1],reverse=True)    
wokey_1=dict(wokey_1)

for x,y in wokey_1.items():  
    print('the word is "','{}'.format(x),'"''"',' and its amount is "','{}'.format(y),'"')  

这是阿里巴巴2016年的一道面试题:

统计英文文章中单词出现的次数,并且输出出现次数的前10个单词

文本如下:

Accessing Text from the Web and from Disk




Electronic Books


A small sample of texts from Project Gutenberg appears in the NLTK corpus collection. However, you may be interested in analyzing other texts from Project Gutenberg. You can browse the catalog of 25,000 free online books at http://www.gutenberg.org/catalog/, and obtain a URL to an ASCII text file. Although 90% of the texts in Project Gutenberg are in English, it includes material in over 50 other languages, including Catalan, Chinese, Dutch, Finnish, French, German, Italian,

先简单的看了下文章,基本单词间的分隔都是空格,或者是逗号加空格

方法一

1、先打开文档,进行初步分析

[python] view plain copy
  1. "font-size:18px;">def read_file():  
  2.     f=open('F:\\Python\\testfile\\test_3.txt')  
  3.     readline=f.readlines()  
  4.     word=[]#存储单词  
  5.   
  6.     #得到文章的单词并且存入列表中:  
  7.   
  8.     for line in readline:  
  9.         #因为原文中每个单词都是用空格 或者逗号加空格分开的,  
  10.         line=line.replace(',','')#除去逗号只要空格来分开单词  
  11.         line=line.strip()#除去左右的空格  
  12.         wo=line.split(' ')  
  13.   
  14.         word.extend(wo)  
  15.     return word  


2、简单的清理和排序

[python] view plain copy
  1. "font-size:18px;">def clear_account(lists):  
  2.         #去除重复的值  
  3.     wokey={}  
  4.     wokey=wokey.fromkeys(lists)#此代码的意思为将lists的元素作为wokey的键值key#通过这个代码可以除去重复的列表元素  
  5.     word_1=list(wokey.keys())  
  6.     #然后统计单词出现的次数,并将它存入一个字典中  
  7.     for i in word_1:  
  8.         wokey[i]=lists.count(i)  
  9.     return wokey  
3、对单词进行排序(因为我们存入的是一个字典,所以其实是对字典排序)

[html] view plain copy
  1. <span style="font-size:18px;">def sort_1(wokey):  
  2. #删除''字符  
  3.     del[wokey['']]#因为我发现字典中存在空元素,所以删去  
  4.     #排序,按values进行排序,如果是按key进行排序用sorted(wokey.items(),key=lambda d:d[0],reverse=True)  
  5.     wokey_1={}  
  6.     wokey_1=sorted(wokey.items(),key=lambda d:d[1],reverse=True)  
  7.          #得到的是一个列表,里面的元素为元组,所以再把他转化为字典,不过不转化也可以  
  8.     wokey_1=dict(wokey_1)  
  9.     return wokey_1span>  
4、输出结果

[python] view plain copy
  1. "font-size:18px;">def main(wokey_1):  
  2. #输出前10个  
  3.     i=0  
  4.     for x,y in wokey_1.items():  
  5.         if i<10:  
  6.             print('the word is "','{}'.format(x),'"''"',' and its amount is "','{}'.format(y),'"')  
  7.             i+=1  
  8.             continue  
  9.         else:  
  10.             break  

5、运行程序得出结果

main(sort_1(clear_account(read_file())))

运行截图:


本程序到这里就结束了、下面是整个程序代码:

[python] view plain copy
  1. "font-size:18px;">#读入一个文本,并且统计文本中单词的出现次数,输出出现次数前10个单词  
  2.   
  3. def read_file():  
  4.     f=open('F:\\Python\\testfile\\test_3.txt')  
  5.     readline=f.readlines()  
  6.     word=[]#存储单词  
  7.   
  8.     #得到文章的单词并且存入列表中:  
  9.   
  10.     for line in readline:  
  11.         #因为原文中每个单词都是用空格 或者逗号加空格分开的,  
  12.         line=line.replace(',','')#除去逗号只要空格来分开单词  
  13.         line=line.strip()  
  14.         wo=line.split(' ')  
  15.   
  16.         word.extend(wo)  
  17.     return word  
  18. def clear_account(lists):  
  19. #去除重复的值  
  20.     wokey={}  
  21.     wokey=wokey.fromkeys(lists)  
  22.   
  23.     word_1=list(wokey.keys())  
  24.     #然后统计单词出现的次数,并将它存入一个字典中  
  25.     for i in word_1:  
  26.         wokey[i]=lists.count(i)  
  27.     return wokey  
  28. def sort_1(wokey):  
  29. #删除''字符  
  30.     del[wokey['']]  
  31.     #排序,按values进行排序,如果是按key进行排序用sorted(wokey.items(),key=lambda d:d[0],reverse=True)  
  32.     wokey_1={}  
  33.     wokey_1=sorted(wokey.items(),key=lambda d:d[1],reverse=True)  
  34.   
  35.     wokey_1=dict(wokey_1)  
  36.     return wokey_1  
  37. def main(wokey_1):  
  38. #输出前10个  
  39.     i=0  
  40.     for x,y in wokey_1.items():  
  41.         if i<10:  
  42.             print('the word is "','{}'.format(x),'"''"',' and its amount is "','{}'.format(y),'"')  
  43.             i+=1  
  44.             continue  
  45.         else:  
  46.             break  
  47.   
  48. main(sort_1(clear_account(read_file())))  
  49.   


不过值得注意的是,字典的排序很重要。

并且上面只给出了一种字典的排序,还有其他的排序比如:

[python] view plain copy
  1. "font-size:18px;">a={'d':2,'f':4,'m':3}  
  2.   
  3. b=a.keys()  
  4. c=a.values()  
  5. d=zip(b,c)#这里的b,c可以交换位置,  
  6. #key在前面就是按key值排序,values在前就是按values排序  
  7. print(sorted(d,reverse=False))  
更多的就只有同学们自己去了解了。。


方法二

下面的方法为Python Spark下的单词统计,这种方法不建议用在少量单词的计算上(spark为大数据集群计算平台,不做大数据的同学就别花时间去学了,还要下载spark,hadoop,和配环境

[python] view plain copy
  1. #coding:utf-8  
  2. import sys  
  3. from pyspark import SparkConf, SparkContext  
  4. try:  
  5.     conf = SparkConf().setMaster("local").setAppName("My App")  
  6.     sc = SparkContext(conf = conf)  
  7.     print("connect success")  
  8. except Exception as e:  
  9.     print("error",e)  
  10.     sys.exit(1)  
  11.   
  12. #计算每个键出现的次数与总值,可用于算均值  
  13. # try:  
  14. #   lis=[("panda",0),("pink",3),("pirate",3),("panda",1),("pink",4),("panda",4)]  
  15. #   rdd=sc.parallelize(lis)  
  16. #   print(rdd.collect())  
  17. #   key1=rdd.mapValues(lambda x: (x, 1))  
  18. #   print(key1.collect())  
  19. #   key2=key1.reduceByKey(lambda x, y: (x[0] + y[0], x[1] + y[1]))  
  20. #   print(key2.collect())  
  21. try:  
  22.     lines=sc.textFile("F:/python/testfile/test_3_1.txt")  
  23.     words=lines.flatMap(lambda x: x.split(" "))  
  24.     print(words.collect())  
  25.     result=words.map(lambda x:(x,1)).reduceByKey(lambda x,y:x+y)  
  26.     print(result.collect())  
  27.     dict_1={}  
  28.     for word in result.collect():  
  29.         dict_1[word[0]]=word[1]  
  30.     print(dict_1)  
  31.     print("242343")  
  32.     list_2=sorted(dict_1.items(),key=lambda d:d[1],reverse=True)  
  33.     print(list_2)  
  34.   
  35.     i=0  
  36.     for x in list_2:  
  37.         if i<10:  
  38.             print("word: ",x[0]," times: ",x[1])    
  39.             i+=1    
  40.             continue    
  41.         else:    
  42.             break    
  43. except Exception as e:  
  44.     print(e)  

单词统计的话,应该还有其他的方法,比如NLTK,(想了解自然语言处理的可以学一下)。

学无止境嘛!


你可能感兴趣的:(python 第三周作业)