检测字符串迭代器是否为空格

时间:2014-02-03 03:55:57

标签: python

我正在尝试编写一小段代码来检测最常出现的字符。但是,我已经陷入无法检测值是否为空白的问题。

以下是我的代码:

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()将无法工作,因为它查找至少一个字符。

6 个答案:

答案 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.CounterCollections.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}
>>>