如何以Pythonic方式合并含不同长度元组的列表组成的列表?
合并元组列表的Pythonic实现方案
直接用列表推导式+zip就能简洁解决这个问题,代码如下:
start = [(3,5), (23,50), (5,12), (51,33), (43,1)] end = [(23,19), (7,2), (34,4), (8,30), (20,10)] path = [[(10,7),(14,9),(18,15)], [], [(15,7)], [(42,32),(20,31)], [(30,7)]] whole_path = [[s] + p + [e] for s, p, e in zip(start, path, end)]
逻辑说明
zip(start, path, end)会将三个列表中对应位置的元素打包成元组(比如第一个元组是((3,5), [(10,7),(14,9),(18,15)], (23,19))),正好匹配每个线条对象的起点、路径、终点。- 列表推导式中,
[s]把单个起点元组转成列表,和路径列表p、转成列表的终点[e]直接拼接,不管p是空列表还是包含多个元组,拼接逻辑都能正常生效。
为什么之前的尝试没成功?
你提到的zip其实完全适用——你之前的误解可能是以为它要处理元组长度的差异,但实际上zip负责的是三个大列表的元素配对,元组/子列表的长度差异由列表拼接逻辑自动处理。而path.insert(0,start)这类操作是错误地修改了整个path列表的结构,没有对应到单个元素的拼接。
运行上述代码后,whole_path的结果和你期望的完全一致。
内容的提问来源于stack exchange,提问作者svn
相关产品推荐
相关产品推荐

