Python实现推文提及次数查询接口时无法得到预期文件操作结果
可行实现思路
核心逻辑不需要依赖复杂字符串方法或者第三方库,靠单次线性遍历文本就能完成所有提及关系的识别,完全满足约束要求:
- 识别规则落地:只要用户名紧邻@符号(不管@在用户名左侧、右侧还是两侧),就算一次有效提及,不需要做字符串替换操作
- 遍历状态维护:全程只需要维护两个状态标记,一个是当前正在拼接的连续用户名字符列表,一个是上一个遍历到的字符是否为@
- 计数触发条件:当遍历到非用户名字符(比如@、空格、标点、换行)时,如果当前已经拼接出完整用户名,且满足「上一个字符是@」或者「当前碰到的字符是@」,就给该用户名的提及次数+1
- 边界处理:遍历完整个文本后,要检查最后一段是否是跟着@的用户名,避免漏记文本末尾的提及
核心实现代码
from collections import defaultdict import urllib.request # 加载待处理推文文本 resp = urllib.request.urlopen("待处理推文文本的访问地址") content = resp.read().decode("utf-8") mention_count = defaultdict(int) current_uname_chars = [] prev_is_at = False for c in content: # 匹配合法用户名字符:字母、数字、下划线,可根据实际用户名规则调整判定条件 if c.isalnum() or c == "_": current_uname_chars.append(c) else: # 碰到分隔符,先处理已经拼接好的用户名 if current_uname_chars: uname = "".join(current_uname_chars) # 只要用户名左边是@ 或者 右边紧接@,就算一次提及 if prev_is_at or c == "@": mention_count[uname] += 1 current_uname_chars = [] # 更新上一个字符是否为@的标记 prev_is_at = (c == "@") # 补处理文本末尾可能残留的用户名 if current_uname_chars and prev_is_at: uname = "".join(current_uname_chars) mention_count[uname] += 1 # 查询接口:传入用户名返回对应提及次数 def query_mention_count(username: str) -> int: return mention_count.get(username, 0)
校验说明
- 针对提到的特殊格式用例:
mark@会统计mark提及1次、@mark会统计mark提及1次、@mark@john@会统计mark提及1次、john提及1次,完全符合@在任意位置都要识别的要求 - 实现全程没有调用
replace()等受限的高级字符串方法,也没有引入任何第三方依赖,全部基于Python基础语法和标准库实现 - 单次线性扫描的时间复杂度为O(n),即使文本量较大也能保持不错的处理效率
内容的提问来源于stack exchange,提问作者Frorayz
相关产品推荐
相关产品推荐

