-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
4

3 回答 3

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})

供您搜索的字母列表。

我们通过简单地减去两个 Countersadvl - Counter(line.lower())并检查结果 Counter 是否没有剩余元素来使用一个技巧。


其他需要注意的事项:

您可以使用with语句来确保您的文件被关闭。
您可以使用enumerate代替计算行号。

于 2012-08-07T07:21:03.123 回答
-3

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

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

这使 advk 成为一个唯一列表,并避免检查行中的多个 'a'。

于 2012-08-07T06:57:14.877 回答
-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,
于 2012-08-07T07:18:00.523 回答