Pythonic字符串测试

时间:2012-02-16 17:45:12

标签: python

对于我的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函数?)。

我是正确还是我只是在思考它?

4 个答案:

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