2012-02-16 48 views
2

对于我的信息检索类,我必须从一组文件中创建术语索引。有效条款包含一个字母字符,所以测试我只是做了一个简单的函数,并使用if/then控制语句。因此,到目前为止,我有:Pythonic字符串测试

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检查术语有效性的方法(可能使用map()或lambda函数?)。

我是正确的还是我只是在推翻它?

+0

小清理,你可能会发现得心应手。 '输入字符串; ALPHA = string.lowercase'。 – istruble 2012-02-16 18:03:41

回答

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 
+0

这有助于很多,非常感谢! – pdeuchler 2012-02-16 17:59:56

+0

而不是使用'print'语句的各种怪癖,我宁愿在最后两行建议打印功能。 – phihag 2012-02-16 18:04:54

+0

呃,只是一个快速演示,'for'循环里面的东西对这个例子来说并不重要。 – kindall 2012-02-16 18:10:02

1

在Python中,字符串对象已经包含了确实的方法,对你:

>>> "abc".isalpha() 
True 
>>> "abc22".isalpha() 
False 
+0

我们在这里也需要'islower' = D – cha0site 2012-02-16 17:52:27

+0

问题是有效的术语可以包含非alpha字符(只是不是唯一的) – pdeuchler 2012-02-16 17:53:20

+0

啊,那还不清楚。所以你的意思是它只需要在字符串中包含一个单一的字母字符? – bgporter 2012-02-16 17:55:29

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):
  • clean可以写很多,啊哈,清洁剂,用filter

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() 
+0

我选择kindall的答案作为正确的答案,但你的帮助仍然很多,欣赏它 – pdeuchler 2012-02-16 18:02:18

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)