有没有一种方法可以根据重复的值将坐标列表分成多个单独的部分?

时间:2019-04-11 13:55:25

标签: python list split coordinates

我正在尝试使用matplotlib.pyplot根据一系列坐标绘制许多单独的几何图形。我当前的坐标列表包含两个几何,如下所示:

coords = [(0.0, -0.31), (2.73, -0.31), (2.73, 0.33), (2.02, 0.95), (1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]    

我想根据重复值将此列表分为多个单独的列表,以创建和绘制封闭的几何图形。当前,这组坐标正确绘制了两个形状,但是它们通过一条线链接在一起。我希望这些是分开的,所以链接它们的线不会画出来。

是否可以拆分此列表,以便在再次达到第一个值(0,-0.31)(即关闭几何图形)时,创建一个新列表,其坐标直到并包括该点?这样可以分离出与闭合形状相关的所有坐标,从而可以进行绘制。

原始坐标列表中可能包含n个几何图形,因此理想情况下,解决方案会将所有这些坐标拆分为单独的坐标对列表,其中第一个和最后一个坐标对相同。

2 个答案:

答案 0 :(得分:0)

您可以使用itertools.groupby

import itertools
coords = [(0.0, -0.31), (2.73, -0.31), (2.73, 0.33), (2.02, 0.95), (1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)] 
c = [[a, list(b)] for a, b in itertools.groupby(coords, key=lambda x:x == coords[0])]
new_result = [c[i][-1]+c[i+1][-1] for i in range(0, len(c), 2)]

输出:

[[(0.0, -0.31), (2.73, -0.31), (2.73, 0.33), (2.02, 0.95), (1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33)], [(0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]]

编辑:要查找所有组,可以使用生成器:

def groups(data):
  for i, a in enumerate(data):
     c = [[a, list(b)] for a, b in itertools.groupby(data[i:], key=lambda x:x == a)]
     yield [c[i][-1]+c[i+1][-1] for i in range(0, len(c)-1, 2)]

print(list(groups(coords)))

输出:

[[[(0.0, -0.31), (2.73, -0.31), (2.73, 0.33), (2.02, 0.95), (1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33)], [(0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(2.73, -0.31), (2.73, 0.33), (2.02, 0.95), (1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(2.73, 0.33), (2.02, 0.95), (1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(2.02, 0.95), (1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43)]], [[(2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(6.73, -0.43), (2.73, -0.43)]], []]

答案 1 :(得分:0)

我将使用自定义生成器:

from itertools import takewhile

coords = [(0.0, -0.31), (2.73, -0.31), (2.73, 0.33), (2.02, 0.95), (1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]

def coord_list(coords):
    coord_iter = iter(coords)
    while True:
        start = next(coord_iter)
        yield [start, *takewhile(lambda x: x != start, coord_iter), start]

list(coord_list(coords))

输出:

[[(0.0, -0.31),
  (2.73, -0.31),
  (2.73, 0.33),
  (2.02, 0.95),
  (1.77, 2.44),
  (1.39, 4.76),
  (0.64, 4.76),
  (0.0, 3.46),
  (0.0, 0.33),
  (0.0, -0.31)],
 [(2.73, -0.43),
  (2.73, -3.5),
  (6.73, -3.5),
  (6.73, -3.0),
  (6.73, -2.0),
  (6.73, -0.43),
  (2.73, -0.43)]]