Python:使用包含索引值的列表来拆分另一个列表

chr*_*rtt 2 python python-3.x

我有一个代表形状坐标的元组列表 - "点"

我还有一个索引值列表,用于标识该形状的每个部分的起点(因为一个形状可以包含一个或多个'岛') - "部分"

目前,要从点列表中提取部分点,我执行以下操作:

points = [
    (0, 0), (1, 0), (2, 1), (3, 2), (0, 0),
    (4, 5), (5, 4), (3, 6), (2, 9), (4, 5),
    (2, 2), (3, 2), (6, 4), (4, 4), (8, 6), (4, 3), (2, 2)
]

parts = [0, 5, 10]

for index, part in enumerate(parts):
    start = part

    try:
        end = parts[index + 1]
    except Exception:
        end = len(points)

    print(points[start:end])
Run Code Online (Sandbox Code Playgroud)

然而,这对我来说并不特别是Pythonic.说实话,使用例外只是感觉非常脏.任何人都可以为这个特殊问题建议改进的Python v3方法吗?

Irf*_*rfy 6

你想这样做:

parts = [0, 5, 10, len(points)]
start_end_pairs = zip(parts[:-1], parts[1:])

for start, end in start_end_pairs:
    print(points[start:end])
Run Code Online (Sandbox Code Playgroud)

说明

parts已经包含起始索引,因此您只需要获取该数组的内容来计算您想要的内容.

[0, 5, 10],您需要采取(0, 5)第一部分,(5, 10)第二(10, len(points))部分和第三部分.创建这些对以在print-loop中使用的过程可以很容易地实现zip.我压缩了两个数组:

[0, 5, 10]
[5, 10, len(points)]
Run Code Online (Sandbox Code Playgroud)

生产

[(0, 5), (5, 10), (10, len(points))]
Run Code Online (Sandbox Code Playgroud)

这正是你所需要的.