我有一个字符串列表,例如:书名= [书名1,书名2,书名3,...。]
我还有一个文本文件,格式如下: logfile.txt
X person borrowed Book name 1 on Y date
Z person borrowed Book name 2 on D date
...
我想知道每本书的借阅次数。因此,我需要计算日志文件中列表“书名”中每个元素的出现次数。最好将结果放在不同的列表中,例如:
书名= [A,b,c,d]
列表生成: 发生率= [1,4,5,0]
我尝试了独裁方法,但是似乎没有用,所以我一直试图获得计数。
我尝试过的事情:
`
file = open('logfile.txt', 'r').read()
b = bookname
count = file.count(b)
print(count)
`
但这不起作用,因为书名是列表而不是字符串。因此,我的想法是创建一个for循环,在该循环中检查列表书名的每个元素上是否出现了这种情况,但是我不知道如何创建一个可行的书,也找不到适合自己需求的书
答案 0 :(得分:1)
如果有列表,则应使用for
循环分别检查列表中的每个元素。结果,您应该append()
列出结果。
booknames = ['Book name 1', 'Book name 2', 'Book name 3']
occurences = []
#text = open('logfile.txt', 'r').read()
text = '''X person borrowed Book name 1 on Y date
Z person borrowed Book name 2 on D date
...'''
for name in booknames:
count = text.count(name)
occurences.append(count)
print(occurences)
结果
[1, 1, 0]
顺便说一句:如果每一行的结构都相似,那么也许您可以得到每一行,并从该行中切断书名,然后使用collections.Counter
来计算名字。
import collections
booknames = ['Book name 1', 'Book name 2', 'Book name 3']
occurences = collections.Counter()
#fh = open('logfile.txt')
fh = '''X person borrowed Book name 1 on Y date
Z person borrowed Book name 2 on D date
...'''.splitlines()
for line in fh:
parts = line.split('borrowed', 1)
if len(parts) < 2:
print("Can't find 'borrowed' in", line)
continue
parts = parts[1].rsplit('on', 1)
if len(parts) < 0:
print("Can't find 'on' in", line)
continue
name = parts[0].strip()
print('found:', name)
occurences.update([name])
print(occurences)
结果
Found: Book name 1
Found: Book name 2
Can't find 'borrowed' in ...
Counter({'Book name 1': 1, 'Book name 2': 1})
然后您可以将booknames
与Counter
一起使用
for name in booknames:
print(name, 'occures', occurences[name], 'times')
结果
Book name 1 occures 1 times
Book name 2 occures 1 times
Book name 3 occures 0 times
或作为列表
result = []
for name in booknames:
result.append( occurences[name] )
print(result)
或更短,具有列表理解力
result = [ occurences[name] for name in booknames ]