对于我的Information Retrieval类,我必须从一组文件中创建术语索引。有效术语包含字母字符,因此要测试我只是创建了一个简单的函数并使用if / then控制语句。到目前为止,我有:
ALPHA = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
def content_test(term):
for a in ALPHA:
if a in term:
return True
return False
class FileRead():
def __init__(self, filename):
f = open(filename, 'r')
content = f.read()
self.terms = content.split()
def clean(self):
for term in self.terms:
if content_test(term) is False:
try:
terms.remove(term)
except:
pass
现在一切正常(我认为......)但是我一直在努力学习更高级别的python,我不禁认为有更多的pythonic方式来检查术语有效性(也许使用地图()或lambda函数?)。
我是正确还是我只是在思考它?
答案 0 :(得分:2)
您可以先简化content_test()
:
def content_test(term):
return any(c.isalpha() for c in term)
事实上,这很简单,你不再需要一个单独的功能了。
在这种情况下我要做的是编写一个只生成文件中有效术语的生成器。然后使用list()
构造函数将其转换为列表。通过这种方式,您可以一次只读取一行,如果文件很大,这将为您节省大量内存。
def read_valid_terms(filename):
with open(filename) as f:
for line in f:
for term in line.split():
if any(c.isalpha() for c in term):
yield term
terms = list(read_valid_terms("terms.txt"))
或者,如果你只是要迭代这些条款,而且只是一次,那么就直接这样做,而不是制作一个清单:
for term in read_valid_terms("terms.txt"):
print term,
print
答案 1 :(得分:1)
在Python中,字符串对象已经包含一个为您执行此操作的方法:
>>> "abc".isalpha()
True
>>> "abc22".isalpha()
False
答案 2 :(得分:1)
虽然您可以使用regular expression,但pythonic方式是使用any
:
import string
def content_test(term):
return any((c in string.ascii_lowercase) for c in term)
如果您还想允许使用大写和区域设置字符,则可以使用str.isalpha
。
补充说明:
FileRead
应继承自object
,以确保它是新式的类。if content_test(term) is False:
。if not content_test(term):
使用filter
clean
可以写得很多,哼哼,更干净:
def clean(self):
self.terms = filter(content_test, self.terms)
f
,因此可能泄漏句柄。使用with
语句自动关闭它,如下所示:
with open(filename, 'r') as f:
content = f.read()
self.terms = content.split()
答案 3 :(得分:0)
使用正则表达式:
import re
# Match any number of non-whitespace characters, with an alpha char in it.
terms = re.findall('\S*[a-zA-Z]\S*', content)