我有一个表示形状坐标的元组列表 - “points”
我还有一个索引值列表,用于标识该形状的每个部分的起点(因为一个形状可以包含一个或多个'孤岛') - “部分”
目前,要从积分列表中提取部分积分,我会执行以下操作:
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])
然而,这对我来说并不特别是Pythonic。说实话,使用例外只是感觉非常脏。任何人都可以为这个特殊问题建议改进的Python v3方法吗?
答案 0 :(得分: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])
您的parts
已经包含起始索引,因此您只需要获取该数组的内容来计算您想要的内容。
从[0, 5, 10]
开始,您需要(0, 5)
代表第一部分,(5, 10)
代表第二部分,(10, len(points))
代表第三部分。创建这些对以在print
- 循环中使用的过程可以使用zip
轻松实现。我压缩了两个数组:
[0, 5, 10]
[5, 10, len(points)]
生产
[(0, 5), (5, 10), (10, len(points))]
这正是你所需要的。
答案 1 :(得分:1)
for i in range(len(parts)):
if i==len(parts)-1:
print(points[parts[i]:])
else:
print(points[parts[i]:parts[i+1]])
或:
for i in range(len(parts)-1):
print(points[parts[i]:parts[i+1]])
print(points[parts[-1]:])
或:
for start, end in zip(parts[:-1], parts[1:]):
print(points[start:end])
print(points[parts[-1]:])