我正在尝试编写一小段代码来检测最常出现的字符。但是,我已经陷入无法检测值是否为空白的问题。
以下是我的代码:
text = "Hello World!"
## User lower() because case does not matter
setList = list(set(textList.lower()))
for s in setList:
if s.isalpha() and s != " ":
## Do Something
else:
setList.remove(s)
问题是设置列表以以下值结束:
[' ', 'e', 'd', 'h', 'l', 'o', 'r', 'w']
我尝试了多种方法来检测空白区域,但没有运气,包括在原始字符串值上使用strip()。 isspace()将无法工作,因为它查找至少一个字符。
答案 0 :(得分:2)
问题是,您在迭代时从列表中删除项目。 永远不要这样做。考虑一下这个案例
['!', ' ', 'e', 'd', 'h', 'l', 'o', 'r', 'w']
这是setList
转换为集合和列表后的样子。在第一次迭代中,将看到!
,并且将从setList
中删除!
。现在删除,下一个字符将成为当前字符
e
。对于下一次迭代,迭代器递增并指向num_list = range(10)
for i in num_list:
print i,
if i % 2 == 1:
num_list.remove(i)
pass
(因为空格是当前字符)。这就是为什么它仍然存在于输出中。您可以使用此程序进行检查
0 1 3 5 7 9
<强>输出强>
num_list.remove(i)
但如果您评论0 1 2 3 4 5 6 7 8 9
,输出将变为
from collections import Counter
d = Counter(text.lower())
if " " in d: del d[" "] # Remove the count of space char
print d.most_common()
要解决您的实际问题,您可以使用collections.Counter
查找字符的频率,例如
[('l', 3), ('o', 2), ('!', 1), ('e', 1), ('d', 1), ('h', 1), ('r', 1), ('w', 1)]
<强>输出强>
{{1}}
答案 1 :(得分:1)
简短的方法是首先从文本中删除空格
>>> text = "Hello world!"
>>> text = text.translate(None, " ")
>>> max(text, key=text.count)
'l'
这不是很有效,因为count会为每个字符扫描整个字符串一次(O(n 2 ))
对于较长的字符串,最好使用Collections.Counter
或Collections.defaultdict
一次性进行计数
答案 2 :(得分:0)
如何在开始列表和集合之前删除空格:
text = "Hello world!"
text = re.sub(' ', '', text)
# text = "Helloworld!"
答案 3 :(得分:0)
要获得最常用的内容,请使用max
:
text = "Hello World!"
count={}
for c in text.lower():
if c.isspace():
continue
count[c]=count.get(c, 0)+1
print count
# {'!': 1, 'e': 1, 'd': 1, 'h': 1, 'l': 3, 'o': 2, 'r': 1, 'w': 1}
print max(count, key=count.get)
# 'l'
如果你想要整个shebang:
print sorted(count.items(), key=lambda t: (-t[1], t[0]))
# [('l', 3), ('o', 2), ('!', 1), ('d', 1), ('e', 1), ('h', 1), ('r', 1), ('w', 1)]
如果你想使用Counter并使用生成器类型方法,你可以这样做:
from collections import Counter
from string import ascii_lowercase
print Counter(c.lower() for c in text if c.lower() in ascii_lowercase)
# Counter({'l': 3, 'o': 2, 'e': 1, 'd': 1, 'h': 1, 'r': 1, 'w': 1})
答案 4 :(得分:0)
上述答案是合法的。如果您不关心算法复杂性,也可以使用内置计数运算符。例如:
## User lower() because case does not matter
text=text.lower()
num=0
most_freq=None
for s in text:
cur=text.count(s)
if cur>num:
most_freq=s
num=cur
else:
pass
答案 5 :(得分:0)
如何使用split()
:如果空格为空,则会失败:
>>> [ x for x in text if x.split()]
['H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd', '!']
>>>
计算副本:
>>> d = dict()
>>> for e in [ x for x in text if x.split()]:
... d[e] = d.get(e,0) + 1
...
>>> print d
{'!': 1, 'e': 1, 'd': 1, 'H': 1, 'l': 3, 'o': 2, 'r': 1, 'W': 1}
>>>