问题:
设计算法并编写Python代码以计算给定段落中唯一单词的数量。
该段落可能包含具有特殊字符的字词,例如!
,?
,.
,,
,:
和;
以及数字是不允许的。
特殊字符必须仅出现在Hello World!
有效但Hello !World
或Hello Wor!ld
无效的段落中的单词的末尾。
没有两个特殊角色一起出现。针对此类情况打印Invalid input
。
计算没有特殊字符的单词。计数必须不区分大小写。以小写和排序顺序打印单词。
我的代码:
import sys
from pprint import pprint`
import re
line=raw_input()
line.lower()
l=line.split(" ")
d=set(l)
count={}
for word in d:
if word in count:
count[word]+=1
else:
count[word]=1
pprint(count)
预期产出:
{'are': 2, 'better': 1, 'dear': 2, 'how': 1, 'you': 2}
我的节目输出:
{'Are': 1, 'How': 1, 'are': 1, 'better': 1, 'dear?': 1, 'you': 1}
答案 0 :(得分:0)
你的问题是错误的迭代。由于set()
返回无序的唯一集合,因此您将遍历唯一列表。
而不是for word in d:
尝试:for word in l:
编辑:
并将if word in count:
更改为if word in count.keys():
,因为您要检查密钥word
是否存在。
答案 1 :(得分:0)
您的代码存在的问题是您没有将输入转换为小写,因为str.lower
无法正常工作。所以您需要更改以下行:
line.lower()
到:
line = line.lower()
但是作为一种更加pythonic的方式,你可以分割你的句子以获得单词列表并用标点符号删除它们然后使用collections.Counter
来获得包含单词和那些频率的字典。
from collections import Counter
line=raw_input().lower()
counter_object= Counter([i.strip('!?.,:;') for i in line.split()])
答案 2 :(得分:0)
您需要删除这两行并添加以下行:
REMOVE:
line.lower()
l=line.split(" ")
ADD:
l = re.sub(r"\s+[\!\?\.\,\:\@]+\s+", r" ", s2.lower()).split(" ")