合并不同长度的元组列表列表

Combine list of lists of tuples with different lengths

提问人:svn 提问时间:6/3/2023 更新时间:6/3/2023 访问量:43

问:

我在合并元组列表列表时遇到问题,主要问题来自这些元组的不同大小。我也在尝试以“pythonic”的方式去做,这并不容易。

我实际上拥有的是一个对象列表,其坐标以元组形式给出。 对象(比如说:线)的起点和终点总是为 (x1,y1) 和 (x2,y2),它们通常也有一些“路径”。问题在于“路径”有时是空的,并且通常路径上的点数是不同的。

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 = [[(3,5),(10,7),(14,9),(18,15),(23,19)],
              [(23,50),(7,2)],
              [(5,12),(15,7),(34,4)],
              [(51,33),(42,32),(20,31),(8,30)],
              [(43,1),(30,7),(20,10)]]

我正在尝试使用 zip - 它适用于开始/结束/路径列表中类似大小的项目,但不适用于它们的差异。 有前途的解决方案可能会随使用和提供,但我无法让它起作用,还有一个选项可以将其放入两个循环中,但它看起来不太好,而且......它不是很“蟒蛇”。 所以:任何建议都会很好。path.insert(0,start)path.extend([end])

Python 合并 元组列表 理解 嵌套列表

评论


答:

0赞 slothrop 6/3/2023 #1

带有可变长度路径元素的解包和解包是相当干净的:zip*

from pprint import pprint

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)]
pprint(whole_path)

提供所需的:

[[(3, 5), (10, 7), (14, 9), (18, 15), (23, 19)],
 [(23, 50), (7, 2)],
 [(5, 12), (15, 7), (34, 4)],
 [(51, 33), (42, 32), (20, 31), (8, 30)],
 [(43, 1), (30, 7), (20, 10)]]

评论

0赞 svn 6/3/2023
谢谢!这是我一直在寻找的完美解决方案,简单而“蟒蛇”!我知道有像 *p 这样的东西可以用来“解压缩”数据,但我从未使用过这种语法。