2012-08-07 34 views
-1

我正在处理一个脚本,脚本应该读取一个文本文件并测试以查看指定的字母(a,a,r,d,v,a,r,k)是否在每行上。我有一个问题,因为我想检查3个不同的a而不是一个。我的代码如下:测试所有字母?

#Variables 
advk = ['a','a','r','d','v','a','r','k'] 
textfile = [] 
number = 0 
life = 0 

for line in open('input.txt', 'rU'): 
    textfile.append(line.rstrip().lower()) 


while life == 0: 
    if all(word in textfile[number] for word in advk): 
     printed = number + 1 
     print ("Aardvark on line " + str(printed)) 
     number+=1 
     if number == len(textfile): 
      life+=1 

    else: 
     number+=1 
+0

因此,当在行上找到'advk'中的一个字母时,您希望该字母被“消耗”并且不计入其余的搜索? – Marius 2012-08-07 06:56:27

+0

对于语法分析,您正在寻找一个文件中的“行”包含字母'['a','a','r','d','v','a','r', 'k']'的顺序?或者它们完全包含在行中?在这种情况下,您可以检查唯一值,'['a','r','d','v','k']'。或者你只是想知道单词“aardvark”是否存在于一行文件中? – 2012-08-07 07:09:38

+0

@InbarRose我想看看我能否在该行的角色上制造盗贼。 – 2012-08-07 07:25:59

回答

8

每次你要计算在Python的东西,保持Counter类的初衷。


from collections import Counter 

advk = Counter(['a','a','r','d','v','a','r','k']) 

with open('input.txt', 'rU') as file: 
    for i, line in enumerate(file.readlines()): 
     if not advk - Counter(line.lower()): 
      print ("Aardvark on line " + str(i+1)) 

鉴于输入线

dffdaardvarksdsda

计数器看起来像这些

Counter({'d': 5, 'a': 4, 'f': 2, 's': 2, 'r': 2, 'k': 1, 'v': 1}) 

Counter({'a': 3, 'r': 2, 'd': 1, 'k': 1, 'v': 1}) 

您的信件,搜索列表。

我们通过简单地减去两个计数器advl - Counter(line.lower())来检查结果计数器是否没有元素。


其他注意事项:

可以使用with声明,以确保你的文件被关闭。
您可以使用enumerate来代替计算行号。

+0

感谢人真的帮助了这个大约4个小时哈哈哈。 – 2012-08-07 07:41:30

+1

+1将我的注意力集中到了我从未注意过的标准库类,但经常有用。谢谢。 – Oddthinking 2012-08-07 07:48:49

-3

如果advk列表是可变的,内容是从其他地方,那么读取保持在列表中的独特元素,你可以将其转换为设置和检查。

advk = ['a','a','r','d','v','a','r','k'] 
advk = list(set(advk)) 

这使得advk成为一个独特的列表,并避免检查多个“a”。

+0

两件事情:为什么要将它转换回列表?集合是可迭代的,并且集合中的点快速检查成员资格(当您转换回列表时,您将失去基于快速哈希的成员资格测试)。而且,Dragan似乎希望整个词“土豚”能够在线上被炒作。这种方法会让“ardvrk”通过。 – 2012-08-07 07:05:05

+0

在风格上,由于字符串是可迭代的,所以你可以直接说'advk = set(“aardvark”)'。 – 2012-08-07 07:07:30

-3
# If the line "ardvrk" should match, this is a solution: 
chars=set('aardvark') 
for nr, line in enumerate(open('input.txt', 'rU')): 
    if not chars-set(line): # is subset? 
     print 'match', nr, line, 
+0

加1,不知道他是否想检查大写匹配或不。 – 2012-08-07 07:24:49

+0

你的假设是错误的,ardvrk应该*不匹配,所以这不是解决OP的问题。 – 2012-08-07 07:28:26

+0

我会用chars.issubset() – 2012-08-07 07:29:40