Python中删除零幅值元组并合并同位置元组的实现方法
处理力点列表:剔除零幅值+合并同位置幅值
直接用字典来处理这类需求最方便,核心思路是利用字典键的唯一性来合并相同位置的幅值,同时跳过零幅值的项,具体步骤和代码如下:
基础实现方法
point_forces = [(0, 4), (3.5, 2), (0, -3.1), (4, 6), (2, 0), (3.5, -4)] # 用字典存每个位置对应的总幅值 force_map = {} for x, f in point_forces: # 跳过幅值为0的项 if f == 0: continue # 累加相同位置的幅值 if x in force_map: force_map[x] += f else: force_map[x] = f # 转成目标列表,同时过滤掉累加后幅值为0的项 result = [(x, f) for x, f in force_map.items() if f != 0] print(result) # 输出结果:[(0, 0.9), (3.5, -2.0), (4, 6)]
简化版(用collections.defaultdict)
如果不想写判断x是否存在的逻辑,可以用defaultdict来简化代码:
from collections import defaultdict point_forces = [(0, 4), (3.5, 2), (0, -3.1), (4, 6), (2, 0), (3.5, -4)] force_map = defaultdict(float) for x, f in point_forces: if f != 0: force_map[x] += f # 同样过滤掉总幅值为0的项 result = [(x, f) for x, f in force_map.items() if f != 0] print(result)
关键说明
- 字典的键天然唯一,完美解决相同位置x的合并需求;
- 两次过滤零值:第一次跳过原列表中f=0的项,第二次过滤合并后总幅值为0的项(比如如果有两个位置相同、幅值互为相反数的项,合并后需要剔除);
- Python 3.7及以上版本的字典会保留键的插入顺序,如果你需要和原列表中x首次出现的顺序一致,直接用普通字典就行;如果顺序无所谓,两种写法都可以。
内容的提问来源于stack exchange,提问作者naterson
相关产品推荐
相关产品推荐

