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

2024-06-16 13:29:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个表示形状坐标的元组列表-“点”

我还有一个索引值列表,这些索引值标识该形状每个部分的起点(因为一个形状可以包含一个或多个“孤岛”)—“parts”

目前,要从点列表中提取零件的点,请执行以下操作:

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])

然而,这对我来说并不特别像Python。老实说,使用异常只是感觉非常肮脏。有人能为这个特殊的问题提出一个改进的pythonv3方法吗?在


Tags: in列表forindexstart标识pointsend
2条回答
for i in range(len(parts)):
    if i==len(parts)-1:
        print(points[parts[i]:])
    else:
        print(points[parts[i]:parts[i+1]])

或者:

^{pr2}$

或者:

for start, end in zip(parts[:-1], parts[1:]):
    print(points[start:end])
print(points[parts[-1]:])

你想这样做:

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])

说明

您的parts已经包含起始索引,因此您只需要获取该数组的内容就可以计算出您想要的内容。在

[0, 5, 10]开始,第一部分需要取{},第二部分取{},第三部分取{}。创建这些对以在print-循环中使用的过程可以用^{}轻松实现。我压缩了两个数组:

^{pr2}$

生产

[(0, 5), (5, 10), (10, len(points))]

这正是你需要的。在

相关问题 更多 >