Python技术问询:数值相似度计算与文本文件目标用户名筛选
解决方法:提取数值并找到最接近targetNum的3个用户
嘿,作为Python新手遇到这种问题完全正常,我来一步步带你实现需求,代码里会加详细注释,保证你能看懂~
整体思路
- 读取文本文件的每一行,解析出用户名和对应的数值
- 计算每个数值与
targetNum的绝对差值(差值越小越接近) - 根据差值从小到大排序,取前3个对应的用户名
完整代码示例
假设你的文本文件名为user_scores.txt,我们可以这样写:
# 定义目标数值,你可以改成自己需要的数 target_num = 60 # 存储用户信息的列表,每个元素是(差值, 用户名, 数值) user_list = [] # 读取文件(自动处理文件关闭,避免资源泄漏) with open('user_scores.txt', 'r', encoding='utf-8') as file: for line in file: # 去掉每行首尾的空格、换行符 cleaned_line = line.strip() # 跳过空行 if not cleaned_line: continue # 按冒号分割,只分割1次(避免用户名里有冒号的情况) parts = cleaned_line.split(':', 1) # 提取用户名并去掉前后空格 username = parts[0].strip() # 提取数值部分,转成整数 try: score = int(parts[1].strip()) except ValueError: # 如果遇到无法转成整数的行,跳过并提示 print(f"警告:行'{cleaned_line}'的数值格式错误,已跳过") continue # 计算当前数值与目标数的绝对差 diff = abs(score - target_num) # 将(差值, 用户名, 数值)加入列表,方便后续排序 user_list.append( (diff, username, score) ) # 按差值从小到大排序(Python会自动按元组的第一个元素排序) user_list_sorted = sorted(user_list) # 取前3个(如果用户数量不足3个,就取所有) top_closest = user_list_sorted[:3] # 输出结果 print(f"与目标数值{target_num}最接近的3个用户:") for idx, (diff, name, score) in enumerate(top_closest, 1): print(f"{idx}. {name}(数值:{score},与目标的差值:{diff})")
代码细节解释
- 文件读取:用
with open语句是Python推荐的安全写法,它会在代码块结束后自动关闭文件,不用手动写file.close() - 行解析:
split(':', 1)确保只分割一次,比如如果用户名是Tom:Jr(虽然你的例子里没有,但提前考虑这种情况),也能正确提取用户名 - 异常处理:加入
try-except是为了避免文件里有格式错误的行导致程序崩溃,比如某行是InvalidUser: abc,会自动跳过并提示 - 排序逻辑:把差值放在元组的第一个位置,
sorted()会自动按差值从小到大排序,非常方便 - 边界处理:如果文件里的用户数量不足3个,
user_list_sorted[:3]会自动取所有用户,不会报错
测试你的示例数据
如果你的文件内容是:
John: 27 Micheal8483: 160 Mary Smith: 57 Adam 22: 68 Patty: 55
当target_num=60时,运行代码会输出:
与目标数值60最接近的3个用户: 1. Mary Smith(数值:57,与目标的差值:3) 2. Patty(数值:55,与目标的差值:5) 3. Adam 22(数值:68,与目标的差值:8)
完全符合你的需求~
内容的提问来源于stack exchange,提问作者DevinGP
相关产品推荐
相关产品推荐

