我遇到了一个问题,我需要在不使用Python中的split()
函数的情况下计算字符串中的字数。
我想到了一种方法,我可以采用变量word=0
并在每次字符串中都有空格时递增它,但它似乎不起作用,因为它总是给出小于实际计数的计数。 / p>
s="the sky is blue"
def countW(s):
print(s)
word=0
for i in s:
if i==" ":
word=word+1
print(word)
countW(s)
我知道这是一个简单的问题,但我很难理解我还能记住什么,以确保我得到正确的数字。 我想到的第二种方法涉及太多的循环和数组创建,然后返回字符串转换。 任何人都可以指出一种更简单的方法,我不会为此增加时间复杂度。
答案 0 :(得分:2)
您还可以使用itertools.groupby
,根据字符是否为字母数字进行分组,并对所有值进行分组(True
等于1
)。
>>> s = "the sky is blue"
>>> sum(k for (k, g) in itertools.groupby(s, key=str.isalnum))
4
答案 1 :(得分:1)
计算空格数是一种很好的方法,大部分时间都可以使用。当然,您必须添加1才能获得正确的单词数。
但是,由于您似乎担心格式不正确的字符串,您必须考虑多个空格,开头和结尾的空格以及标点符号。
如果你不想使用正则表达式(如在Ezsrac的回答中),这里有一个替代方案,它将字符,数字和下划线的组合视为单词,就像\w
一样。它只计算单词字符和非单词字符之间的所有转换。最后需要特别注意最后考虑非单词字符(例如"a a "
与"a a"
)。
def is_word_character(c):
return 'a' <= c <= 'z' or 'A' <= c <= 'Z' or '0' <= c <= '9' or c == '_'
def word_count(str):
c = 0
for i in range(1, len(str)):
if not is_word_character(str[i]) and is_word_character(str[i-1]):
c += 1
if is_word_character(str[-1]):
c += 1
return c
以下是一些测试用例:
>>> word_count("the sky is blue")
4
>>> word_count("the sky is blue.The")
5
>>> word_count(" the sky is blue ")
4
>>> word_count(" the sky is blue\nand not green ")
7
如果您还想包含其他字符,您可以简单地扩展is_word_character
功能,但请注意,如果不使用非常高级的技术,则无法考虑所有角落情况。例如,请考虑"You are good-looking"
与"This is good-looking into the sky"
。这样一个简单的程序不可能认识到第一个是复合形容词,而第二个程序由两个链接不好的句子组成。
答案 2 :(得分:1)
具有状态的最简单的有限自动机 - 在单词或外部。伪代码:
InsideWord = false
Count = 0
for c in s
if c is not letter
InsideWord = false
else
if not InsideWord
Count++
InsideWord = true
答案 3 :(得分:0)
如果您真的不想使用拆分,可以试试正则表达式:
import re
s= "the sky is blue"
count = len(re.findall(r'\w+', s))
print (count)