use*_*351 4 python string count python-3.x
我有一个问题可以帮助简化我的编程.所以我有这个文件text.txt,在其中我想查看它并将其与单词列表进行比较words,每次找到单词时它都会添加1一个整数.
words = ['the', 'or', 'and', 'can', 'help', 'it', 'one', 'two']
ints = []
with open('text.txt') as file:
for line in file:
for part in line.split():
for word in words:
if word in part:
ints.append(1)
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否有更快的方法来做到这一点?文本文件可能会更大,单词列表会更大.
您可以将其转换words为a set,以便查找更快.这应该可以为您的程序提供良好的性能提升,因为查找列表中的值必须一次遍历列表一个元素(O(n)运行时复杂性),但是当您将列表转换为集合时,运行时复杂性将降低到O(1)(恒定时间).因为集合使用哈希来查找元素.
words = {'the', 'or', 'and', 'can', 'help', 'it', 'one', 'two'}
Run Code Online (Sandbox Code Playgroud)
然后,只要有匹配,就可以使用sum函数来计算它
with open('text.txt') as file:
print(sum(part in words for line in file for part in line.split()))
Run Code Online (Sandbox Code Playgroud)
布尔值及其整数等价物
在Python,布尔表达式的结果将是等于或者0或1用于False和True分别.
>>> True == 1
True
>>> False == 0
True
>>> int(True)
1
>>> int(False)
0
>>> sum([True, True, True])
3
>>> sum([True, False, True])
2
Run Code Online (Sandbox Code Playgroud)
所以每当你检查part in words,结果将是要么0还是1和我们sum所有的值.
上面看到的代码在功能上等同于
result = 0
with open('text.txt') as file:
for line in file:
for part in line.split():
if part in words:
result += 1
Run Code Online (Sandbox Code Playgroud)
注意:如果你真的想1在匹配时进入列表,那么你可以简单地将生成器表达式转换sum为列表理解,就像这样
with open('text.txt') as file:
print([int(part in words) for line in file for part in line.split()])
Run Code Online (Sandbox Code Playgroud)
单词的频率
如果你真的想找到在个别单词的频率words,那么你可以使用collections.Counter这样的
from collections import Counter
with open('text.txt') as file:
c = Counter(part for line in file for part in line.split() if part in words)
Run Code Online (Sandbox Code Playgroud)
这将在内部计算words文件中每个单词出现的次数.
根据评论,你可以有一个字典,你可以存储积极评分为正面的单词,负面评分为负面单词,并将其计为如下
words = {'happy': 1, 'good': 1, 'great': 1, 'no': -1, 'hate': -1}
with open('text.txt') as file:
print(sum(words.get(part, 0) for line in file for part in line.split()))
Run Code Online (Sandbox Code Playgroud)
在这里,我们使用words.get字典来获取存储在单词中的值,如果在字典中找不到单词(既不是好单词也不是坏单词),则返回默认值0.
| 归档时间: |
|
| 查看次数: |
1210 次 |
| 最近记录: |