Python列表扩展异常:使用extend后仍保留原列表嵌套结构
解决列表extend后仍保留嵌套结构的问题
你的问题根源在于循环中使用append添加了嵌套列表,导致points1初始就是嵌套结构,后续的extend只是追加了外层元素,并没有处理已有的嵌套部分。
问题重现
你的代码中,landmarksPoint()返回一个包含坐标元组的列表,而循环里用append把这个列表直接加入points1:
for hand in hands: landmarks = predictor(imageGray1, composite1) points1.append(landmarksPoint()) # append会把整个列表作为单个元素加入
这使得points1初始结构为[[(x1,y1), (x2,y2), ...]],后续用extend(boundaryLoc)只是把边界元组逐个追加到外层,最终结果就保留了第一个嵌套子列表。
两种解决方案
方案1:循环中直接用extend替代append
把循环里的append改成extend,直接将landmarksPoint()返回的列表中的元素逐个加入points1,从根源避免嵌套:
def landmarksPoint(): landmarkPoints = [] for n in range(pointNumber): x = landmarks.part(n).x y = landmarks.part(n).y landmarkPoints.append((x, y)) return landmarkPoints points1 = [] # 确保points1初始为空列表 for hand in hands: landmarks = predictor(imageGray1, composite1) points1.extend(landmarksPoint()) # 用extend替代append print(points1) boundaryLoc = (1,1), (700,1), (1590, 1), (1590,500), (1590, 1190), (700, 1190), (1, 1190), (1,500) points1.extend(boundaryLoc) print(points1)
方案2:展开已有的嵌套列表(如果已经执行了append操作)
如果已经生成了嵌套的points1,可以先将其扁平化,再追加边界点:
# 扁平化points1 flattened = [] for item in points1: if isinstance(item, list): flattened.extend(item) else: flattened.append(item) # 追加边界点 flattened.extend(boundaryLoc) points1 = flattened print(points1)
修改后效果
两种方案最终都会让points1变成所有坐标元组处于同一层级的列表,不再有嵌套结构:
[(992, 191), (1178, 337), ..., (922, 563), (1, 1), (700, 1), ..., (1, 500)]
内容的提问来源于stack exchange,提问作者Cat Face
相关产品推荐
相关产品推荐

