題目
請編寫程序,對一段英文文本,統計其中所有不同單詞的個數,以及詞頻最大的10%的單詞。所謂“單詞”是指由不超過80個單詞字符組成的連續字符串,但長度超過15的單詞將只截取保留前15個單詞字符。而合法的“單詞字符”為大小寫字母、數字和下劃線,其它字符均認為是單詞分隔符。注意“單詞”不區分英文大寫,例如“PAT”和“pat”被認為是同一個單詞。輸入給出一段非空文本,最后以符號#結尾。輸入保證存在至少10個不同的單詞。輸出按照詞頻遞減的順序,按照“詞頻:單詞”的格式輸出詞頻最大的前10%的單詞。若有并列,則按遞增字典序輸出。
(浙江大學 Python程序設計 陳春暉)
import sys
s=sys.stdin.read();strs=s[:s.find('#')]#輸入“Ctrl-d”結束輸入
#"s[:s.find(‘#’)]"
#表示取輸入字符串,以符號“#”結尾
for k in set([i for i in strs if i.isalnum()==False and i!='_']):#isalnum判斷是否是數字、字母
strs=strs.replace(k, ' ') #其它字符均認為是單詞分隔符
#去掉尾隨空格,全部變小寫,變成列表
strs=strs.rstrip(' ').lower().split() #全部變小寫
counts=dict()
for i in strs:
k=i[:15] #取前15個字符
if k not in counts:
counts[k]=1
else:
counts[k]+=1
#詞頻遞減的順序輸出,從大到小
#若有并列,則按遞增字典序 ,從小到大
#用負數把從大到小變為從小到大
ans=sorted(counts.items(), key=lambda x:(-x[1], x[0]))#ans是大列表套小列表
print(len(counts))
for i in range(0,int(0.1*len(counts))):
print(str(ans[i][1])+':'+ans[i][0])
輸入:
34 happy haha heyr ha hraurhauj878 85782 jhrfa hfaury23 8383 8383 8383 ha 34 34
55 55 88 happy happy happy happy happy 34 34 34 happy 788 h77 h7 h4 749 84 j9
87654 jji
輸出結果:
21#輸入了多少單詞(重復單詞不計)
7:happy
6:34
關于sys.read()函數
import sys
try:
while True:
print('Please input a number:')
n = int(sys.stdin.readline().strip('\n')) #strip('\n')表示去掉字符串中\n,否則輸出是“字符串+\n”
print('Please input some numbers:')
sn = sys.stdin.readline().strip()#strip()默認去掉字符串左側、右側的空格、\n
if sn == '':
break
sn = list(map(int,sn.split())) #如果要強制轉換成int等類型,可以調用map()函數。
print(n)
print(sn,'\n')
except:
pass
input()方法和stdin()類似,不同的是input()括號內可以直接填寫說明文字。
關于find()
>>>info = 'abca'
>>> print info.find('a') # 從下標0開始,查找在字符串里第一個出現的子串,返回結果:0
0
>>> print info.find('a',1) # 從下標1開始,查找在字符串里第一個出現的子串:返回結果3
3
>>> print info.find('3') # 查找不到返回-1
-1
>>>
#!/usr/bin/python
str1 = "this is string example....wow!!!";
str2 = "exam";
print str1.find(str2);
print str1.find(str2, 10);
print str1.find(str2, 40);
(轉載自菜鳥教程 (runoob.com))