繁体   English   中英

在 Python 中填写坐标列表

[英]Filling up a coordinate list in Python

我有一个排序的坐标列表,例如

coords = [[19, 52], [20, 52], [24, 52], [25, 52], [20, 53], [22, 53], [20, 54], [21, 54]]

我想填写“中间”的坐标,这样结果列表是:

result = [[19, 52], [20, 52], [21, 52], [22, 52], [23, 52], [24, 52], [25, 52], [20, 53], [21, 53], [22, 53], [20, 54], [21, 54]]

我怎样才能做到这一点? 我们可以假设坐标中的“间隙”始终是连续的或零,就像坐标中的最后两个“元组”一样。 我们在这里也只处理整数。 我设法编写了一个可以在 1 y 坐标上执行此操作的函数:

def fillElements(sequence):
    k=0
    while (sequence[k][0]+1) == (sequence[(k+1) % len(sequence)][0]):
        k+=1
    if k == len(sequence):
        return sequence
    else:
        dummy = list(range((sequence[k][0]+1), sequence[k+1][0]))
        for l in range(len(dummy)):
            sequence.append([dummy[l], sequence[0][1]])
        return sequence

该函数首先通过将当前元素的 x 值与下一个元素的 x 值进行比较来找到坐标缺失的“中断”; 如果它们相距超过 1,则存在中断。 我也已经处理了一些边缘情况,其中 (i+1) 超出了列表的长度; 相反,它返回并与第一个条目进行比较。 在这种情况下,当 while 循环结束时,运行索引 k 应该正好是序列的长度,并且序列不变地返回。 如果运行索引小于序列的长度,则表示存在中断。 在这种情况下,我通过使用 range() 创建了一个包含所有缺失 x 值的虚拟列表,边界是第 k 个“元组”,循环被破坏,+1,因为我不想有两次相同的 x 值,以及下一个元素。 然后我将这些值附加到带有 y 坐标的子列表中。

然而,虽然这个函数有效,但代码有点丑,就像我说的,它只对一个 y 坐标有效。 解决后者是最重要的部分,但如果有人首先提出改进此代码或使用其他方法的建议,请告诉我。 结果列表中坐标的顺序并不重要。

e:如果是“唯一的 y 坐标”,例如“元组”[20, 51],则不应更改任何内容,因为“中间”没有元素。

如果我理解正确,您想填充x坐标中的空白,每次y坐标更改时重置。

以下是将执行此操作的 Python 3 解决方案:

def fill_gaps(coordinates):
    last_x, last_y = None, None

    for x, y in coordinates:
        if y == last_y:
            # Fill in any potential gaps between the last value and us
            yield from ([new_x, y] for new_x in range(last_x + 1, x))

        last_x, last_y = x, y
        yield [x, y]

这使用生成器使代码更容易一些,所以如果你想要一个列表,你需要用list()包装调用来实现它:

result = list(fill_gaps(coords))

此解决方案需要按照您的说明对坐标进行排序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM