为了账号安全,请及时绑定邮箱和手机立即绑定

在Python中填充坐标列表

在Python中填充坐标列表

富国沪深 2023-06-27 16:24:25
我有一个排序的坐标列表,例如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 坐标。解决后者是最重要的部分,但如果有人有建议改进此代码或首先使用其他方法,请告诉我。结果列表中坐标的顺序并不重要。e:如果是“唯一的 y 坐标”,例如“元组”[20, 51],则不应更改任何内容,因为“中间”没有元素。
查看完整描述

1 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

如果我理解正确的话,您想要填充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))

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


查看完整回答
反对 回复 2023-06-27
  • 1 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信