我正在编写一个脚本,脚本应该读取一个文本文件并测试每行是否有指定的字母(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 :(得分: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())
并检查结果计数器是否没有剩余元素来使用技巧。
其他注意事项:
答案 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,