Python 统计文本文件中列表中字符串的出现次数
我有一个字符串列表,例如:booknames=[书名1,书名2,书名3,…] 我还有一个这样格式的文本文件: logfile.txtPython 统计文本文件中列表中字符串的出现次数,python,python-3.x,list,count,Python,Python 3.x,List,Count,我有一个字符串列表,例如:booknames=[书名1,书名2,书名3,…] 我还有一个这样格式的文本文件: logfile.txt X人借书名1于Y日期 Z人于D日借书名2 … 我想知道每本书被借了多少次。因此,我需要从日志文件中的“booknames”列表中计算每个元素的出现次数。优选地,结果将在不同的列表上,例如: 书名=[A、b、c、d] 生成的列表: 发生率=[1,4,5,0] 我尝试过措辞的方法,但似乎不起作用,所以我一直在努力数数 我试过的东西: ` ` 但这不起作用,因为book
X人借书名1于Y日期
Z人于D日借书名2
…
我想知道每本书被借了多少次。因此,我需要从日志文件中的“booknames”列表中计算每个元素的出现次数。优选地,结果将在不同的列表上,例如:
书名=[A、b、c、d]
生成的列表:
发生率=[1,4,5,0]
我尝试过措辞的方法,但似乎不起作用,所以我一直在努力数数
我试过的东西:
`
`
但这不起作用,因为bookname是一个列表而不是字符串。因此,我的想法是创建一个for循环,它检查list bookname中每个元素的出现情况,但是我不知道如何创建一个可行的for循环,也找不到一个适合我需要的for循环。如果您有list,那么您应该使用
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]
Found: Book name 1
Found: Book name 2
Can't find 'borrowed' in ...
Counter({'Book name 1': 1, 'Book name 2': 1})
Book name 1 occures 1 times
Book name 2 occures 1 times
Book name 3 occures 0 times
顺便说一句:如果每一行都有相似的结构,那么也许你可以得到每一行并从每一行中删除书名,然后使用
集合。计数器来计算书名
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)
然后您可以将书名
与计数器
for name in booknames:
print(name, 'occures', occurences[name], 'times')
结果
[1, 1, 0]
Found: Book name 1
Found: Book name 2
Can't find 'borrowed' in ...
Counter({'Book name 1': 1, 'Book name 2': 1})
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 ]
欢迎来到StackOverflow!请编辑您的问题,以包括您迄今为止编写的代码,以及您面临的具体错误或问题。谢谢Nick,我已经将我迄今为止的想法付诸实施,这太糟糕了。如果您有列表,那么您必须使用进行
-循环。如果您尝试,然后显示问题中的代码-可能您使用了不正确的代码。为什么b=bookname
和count=file.count(b)
缩进?您答案的第一部分按我所希望的那样工作,现在我可以使用booklist和occurrence创建我所希望的图形。非常感谢。