如何移除zip生成的元组列表中XaData重复的元组?
按X值去重元组列表并适配scipy.CubicSpline
我通过zip合并三个列表生成元组列表:
XYZip = list(zip(XaData, Y1aData, Y2aData))
生成的列表示例如下:
[ (0.001625625, 4.782947316198166, -0.011032947316198166), (-2.5e-06, 4.783447358402665, 0.020216552641597337), (0.0008137499999999999, 4.782997384780477, -0.017282997384780476), (0.00081, 4.783247405882726, 0.020216752594117274), (0.001625625, 4.782066023993667, -0.011032066023993668), (0.00324625, 4.780809700135795, 0.03271919029986421), ..., (19.4121325, 4.653511649011105, 1.1703464883509889) ]
需要移除仅XaData值重复的元组(比如X值为0.001625625的第二个元组),因为这些数据要传入scipy.CubicSpline函数,该函数要求X值严格递增且不能重复。
之前尝试用set()去重,但无法实现需求——set()会把整个元组作为判断重复的依据,而不是仅判断X值。之前的代码如下:
XYZip = list(zip(XaData, Y1aData, Y2aData)) XYUnique = set(XYZip) XYSorted = sorted(XYUnique) XaData, Y1aData, Y2aData = zip(*XYSorted)
解决方案
可以利用字典键的唯一性,或者通过集合记录已出现的X值,实现仅按X值去重:
方法1:保留每个X值第一次出现的元组
# 初始化集合记录已出现的X值 seen_x = set() XYUnique = [] for item in XYZip: x_val = item[0] if x_val not in seen_x: seen_x.add(x_val) XYUnique.append(item) # 按X值排序,拆分回三个列表 XYSorted = sorted(XYUnique, key=lambda x: x[0]) XaData, Y1aData, Y2aData = zip(*XYSorted)
方法2:简洁写法(保留每个X值最后出现的元组)
如果不需要保留第一次出现的元组,可用字典推导式快速去重(重复X值会被最后出现的元组覆盖):
# 用X值作为键,元组作为值,自动去重 XYUnique_dict = {item[0]: item for item in XYZip} XYUnique = list(XYUnique_dict.values()) # 按X值排序并拆分 XYSorted = sorted(XYUnique, key=lambda x: x[0]) XaData, Y1aData, Y2aData = zip(*XYSorted)
处理后的列表示例如下(仅保留唯一X值的元组):
[ (0.001625625, 4.782947316198166, -0.011032947316198166), (-2.5e-06, 4.783447358402665, 0.020216552641597337), (0.0008137499999999999, 4.782997384780477, -0.017282997384780476), (0.00081, 4.783247405882726, 0.020216752594117274), (0.00324625, 4.780809700135795, 0.03271919029986421), ..., (19.4121325, 4.653511649011105, 1.1703464883509889) ]
内容的提问来源于stack exchange,提问作者casandra9
相关产品推荐
相关产品推荐

