排序映射中的键



程序在开始时得到一个输入。输入的字符串可以包含大写字母或任何其他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}

最新更新