计算字符串中的单词而不使用拆分

时间:2017-02-16 19:21:45

标签: python algorithm

我遇到了一个问题,我需要在不使用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)

我知道这是一个简单的问题,但我很难理解我还能记住什么,以确保我得到正确的数字。 我想到的第二种方法涉及太多的循环和数组创建,然后返回字符串转换。 任何人都可以指出一种更简单的方法,我不会为此增加时间复杂度。

4 个答案:

答案 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)