程序在开始时得到一个输入。输入的字符串可以包含大写字母或任何其他ascii字母。我们不区分它们,所以我们只使用lower()方法。此外,除字母(数字等)以外的任何字母都用作字符串之间的空格。函数应该对输入进行分析,排序和计数。输出:
{'idk': 2, 'idc': 1, 'idf': 1}
输入:
print(word_frequency("Idk, Idc, Idk, Idf"))
我试过了,它正在排序输入,但我找不到一种方法来分离字符串。我是这样做的:
def word_frequency(text):
f = {}
pendens = ""
for s in text:
if s.isalpha():
pendens += s
else:
pendens = pendens.lower()
if pendens != " ":
if f.get(pendens, -1) != -1:
f[pendens] += 1
else:
f[pendens] = 1
pendens = pendens.lower()
if pendens != " ":
if f.get(pendens, -1) != -1:
f[pendens] += 1
else:
f[pendens] = 1
return f
print(word_frequency("Idk, Idc, Idk, Idf"))
print(word_frequency("Idk,+Idc,Idk;;-;Idf"))
print(word_frequency("help me please"))
我正在努力在编码方面做得更好,所以任何形式的帮助都会很感激:)
最简单的解决方案是使用regex和Counter, Counter是一种专门用于计算值出现次数的字典,如下所示:
>>> import re
>>> from collections import Counter
>>> words = 'Idk, Idc, Idk, Idf'
>>> re.findall('[a-z]+', words.lower())
['idk', 'idc', 'idk', 'idf']
>>> Counter(re.findall('[a-z]+', words.lower()))
Counter({'idk': 2, 'idc': 1, 'idf': 1})
如果不能使用Counter,那么普通字典也可以使用。我们可以使用dict.get
来处理既在字典中又不在字典中的单词:
def count_words(words):
counts = {}
for word in re.findall('[a-z]+', words.lower()):
counts[word] = counts.get(word, 0) + 1
return counts
结果:
>>> count_words('Idk, Idc, Idk, Idf')
{'idk': 2, 'idc': 1, 'idf': 1}
如果你不能使用正则表达式,那么问题变得更复杂,但仍然是可行的。下面的生成器可以工作:
def split_words(words):
word = ''
for c in words.lower():
if 97 <= ord(c) <= 122: # ord('a') thru ord('z')
word += c
elif word:
yield word
word = ''
if word:
yield word
def count_words(words):
counts = {}
for word in split_words(words):
counts[word] = counts.get(word, 0) + 1
return counts
结果:
>>> count_words('Idk, Idc, Idk, Idf')
{'idk': 2, 'idc': 1, 'idf': 1}