2013-10-16 72 views
1

我需要计算一个句子中的单词。例如,“我遛狗”。会是4个单词,但“我走3只狗”只会是4个单词,因为数字不是单词。该代码只能计算字母词。我明白如何通过简单地使用以下数字来计算单词:。分裂python字数

len(string.split) 

但是这不占数字。是否有简单的方法(对于初学者)来解释数字,符号等?谢谢。

+2

“我走过我的小猎犬Har”怎么样?这是一个可能的四个单词的句子? (我问,因为它会打破一些'isalpha()'的方法。) – DSM

+2

我会提交一个句子中的数字*是*字。 –

+0

如果我将'4'拼写成'four'会怎么样?这句话的含义并没有改变! '4'也是你的句子中的一个词。 –

回答

3
totalWords = sum(1 for word in line.split() if word.isalpha()) 

您可以使用split函数根据空格拆分它。然后检查每个单词是否只有使用isalpha函数的字母。如果它是真的,那么包括1.最后总结所有这些。

+0

如果无论如何不使用可以想到的.isalpha做到这一点?以某种方式列出你的字符串或其他东西? – jerry2144

+0

@ jerry2144你是否考虑了分词标记以及单词分隔符? – thefourtheye

+0

'如果不是word.isdigit()'将允许''不要''和''背对背''被计为单词。当然,“3rd”和“3.145”会算作单词。也许'如果不是word [0] .isdigit()'会更好。但是你仍然会在''''3'中出现问题''''3只猫缺失,'她说,'如果有的话(c.isalpha()for c in word)''最少有问题。 –

1

您可以在字符串上使用.isalpha()

len([word for word in sentence.split() if word.isalpha()]) 
0

如果你不想使用.isalpha

sum(not word.isdigit() for word in line.split()) 

这将返回True为每个不是一个数字的话,和False每个这是一个数字。这段代码利用了这个事实,在python中,True == 1False == 0,所以你会得到非数字的数量。


如果您是使用-ness的boolint的S,你可以把它明确你的代码中加入了int功能,读者不舒服(这是没有必要100%,但是可以使代码更清晰,如果你喜欢这种方式)

sum(int(not word.isdigit()) for word in line.split()) 
+0

)如果你的需求不仅仅是数字,让我知道,我可以根据你的需要进行修改。我将这段代码作为你的例子。如果你有类似“I <3 U”的事情怎么办?“<3”不计为数字。 – SethMMorton

2

这里的另一种选择:

import re 

lines = [ 
    'I walk by dog', 
    'I walk my 3 dogs', 
    'I walk my Beagle-Harrier' # DSM's example 
] 

for line in lines: 
    words = re.findall('[a-z-]+', line, flags=re.I) 
    print line, '->', len(words), words 

# I walk by dog -> 4 ['I', 'walk', 'by', 'dog'] 
# I walk my 3 dogs -> 4 ['I', 'walk', 'my', 'dogs'] 
# I walk my Beagle-Harrier -> 4 ['I', 'walk', 'my', 'Beagle-Harrier'] 
0

因为,由于它的意见看起来他想要的东西不使用.isalpha,我们可以在try/except中运行。

count = 0 
for word in line.split(): 
    try: 
     int(word) 
    except ValueError: 
     count += 1 

我知道这不是很漂亮,但它正确处理它。

+0

或者'float(word)'也可以摆脱浮点。你的try-except有类似的行为来检查'not word.isdigit()'。 –

+0

我认为,因为op不想要.isalpha,所以他不想要他那种风格的任何其他人。 –