Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 统计文本文件中列表中字符串的出现次数_Python_Python 3.x_List_Count - Fatal编程技术网

Python 统计文本文件中列表中字符串的出现次数

Python 统计文本文件中列表中字符串的出现次数,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

我有一个字符串列表,例如:booknames=[书名1,书名2,书名3,…]

我还有一个这样格式的文本文件: logfile.txt

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创建我所希望的图形。非常感谢。