我试图使用python 3.5对文本文件中的单词进行标记化,但有一些错误。这是代码:
import re
f = open('/Users/Half_Pint_Boy/Desktop/sentenses.txt', 'r')
a=0
c=0
for line in f:
b=re.split('[^a-z]', line.lower())
a+=len(filter(None, b))
c = c + 1
d = d + b
print (a)
print (c)
我的问题:
构造a+=len(filter(None, b))
在python 2.7中工作正常但在3.5中它会导致类型的错误:
type' filter'没有
len()
如何使用python 3.5解决?
当我进行标记化处理时,我的代码也将空格作为字标记。我该如何删除它们?
谢谢!
答案 0 :(得分:1)
您需要在Python 3.5中列出显式强制转换以获取序列的长度,因为filter
返回迭代器对象而不是Python 2.7中的列表:
a += len(list(filter(None, b)))
# ^^
从re.split
返回的空格,例如:
>>> line = 'sdksljd sdjsh 1213hjs sjdks'
>>> b=re.split('[^a-z]', line.lower())
>>> b
['sdksljd', 'sdjsh', '', '', '', '', 'hjs', 'sjdks']
您可以使用列表理解中的if
上的过滤器删除re.split
的结果,如下所示:
b = [i for i in re.split('[^a-z]', line.lower()) if i]
列表中的if i
部分。返回False
表示空字符串,因为bool('') is False
。所以空字符串被清除。
列表理解的结果也可以通过filter
(您已经与a
一起使用)来实现:
b = list(filter(None, re.split('[^a-z]', line.lower()))) # use the list comprehension if you don't like brackets
最后,a
可以在两种方法中的任何一种之后计算:
a += len(b)