如何筛选右侧值为1.0的文本数据并生成整洁列表?
搞定文本数据筛选与格式整洁化问题
嘿,我来帮你解决这个数据筛选和格式整理的小问题!先聊聊你之前代码踩的几个坑,再给你一个靠谱的解决方案。
问题分析
你之前的代码出现混乱结果,主要是这几个原因:
- 逻辑判断错误:第一个代码用了
or,这等于说"只要值不是-0.0 或者 不是0.0就保留"——但任何值都满足这个条件,所以所有内容都被加进去了; - 没过滤注释行:像
y: 3 dimensions, 657 entries:这种非数据行被误判为有效数据; - 拆分方式不对:原始数据一行包含多个
[xxx] = 值的键值对,直接按空格拆分把每个键值对拆成了零散的单词,导致结构混乱; - 忽略浮点精度:比如
0.9999999999999876其实是1.0的浮点近似值,应该被保留,而-1.2545520178264269e-14是近似0的数值,应该被排除。
修正后的代码
这里用正则表达式精准匹配键值对,同时处理浮点精度和注释行问题,代码如下:
import re # 正则匹配格式:[xxx] = 数值(支持科学计数法) kv_pattern = re.compile(r'(\[.*?\]) = ([\-+]?\d+\.?\d*(?:e[\-+]?\d+)?)') cleaned_results = [] with open("t.txt", "r") as file: for line in file: line = line.strip() # 跳过注释行(包含dimensions/entries的行) if "dimensions" in line or "entries:" in line: continue # 提取当前行所有的键值对 all_pairs = kv_pattern.findall(line) for key, value_str in all_pairs: try: value = float(value_str) # 允许微小浮点误差(1e-10以内视为等于1.0) if abs(value - 1.0) < 1e-10: # 整理成整洁的格式,可选存字符串或元组 cleaned_results.append(f"{key.strip()} = 1.0") # 如果需要结构化列表,用下面这行: # cleaned_results.append( (key.strip(), 1.0) ) except ValueError: # 跳过无法转换为数值的异常情况 continue # 打印整洁输出 print("筛选后的结果:") for item in cleaned_results: print(item)
预期输出示例
运行后你会得到整洁的、仅包含值为1.0(或近似1.0)的条目:
[1, 5, 7] = 1.0 [2,11] = 1.0 [3, 2] = 1.0 [3, 6, 2] = 1.0 [7, 4, 3] = 1.0 [1, 8] = 1.0 [7, 3] = 1.0 [8,10] = 1.0 [10, 7] = 1.0
代码要点说明
- 用正则表达式精准捕获每个键值对,避免拆分混乱;
- 过滤掉无关的注释行,只处理有效数据;
- 用浮点误差范围判断,解决浮点精度导致的近似值问题;
- 输出格式可自定义,既可以是整洁的字符串,也可以是结构化的元组列表。
内容的提问来源于stack exchange,提问作者Kim
相关产品推荐
相关产品推荐

