测试所有字母?

时间:2012-08-07 06:42:08

标签: python

我正在编写一个脚本,脚本应该读取一个文本文件并测试每行是否有指定的字母(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

3 个答案:

答案 0 :(得分: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代替行号。

答案 1 :(得分:-3)

如果advk list是可变的并且内容是从其他地方读取的,那么为了维护列表中的唯一元素,您可以将其转换为set和check。

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

这使得advk成为一个独特的列表,并避免检查该行中的多个。

答案 2 :(得分:-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,