我有一個排序的坐標(biāo)列表,例如coords = [[19, 52], [20, 52], [24, 52], [25, 52], [20, 53], [22, 53], [20, 54], [21, 54]]我想填寫“之間”的坐標(biāo),這樣結(jié)果列表是: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]]我怎樣才能做到這一點?我們可以假設(shè)坐標(biāo)中的“間隙”始終是連續(xù)的或零,就像坐標(biāo)中最后兩個“元組”的情況一樣。我們在這里也只處理整數(shù)。我已經(jīng)成功編寫了一個函數(shù),可以對 1 個 y 坐標(biāo)執(zhí)行此操作: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該函數(shù)首先通過比較當(dāng)前元素的 x 值與下一個元素的 x 值來找到坐標(biāo)缺失的“中斷”;如果它們相距超過 1,則存在中斷。我還已經(jīng)處理了一些邊緣情況,其中 (i+1) 超出了列表的長度;相反,它會返回并與第一個條目進(jìn)行比較。在這種情況下,當(dāng) while 循環(huán)結(jié)束時,運行索引 k 應(yīng)該恰好是序列的長度,并且序列不變地返回。如果運行索引小于序列的長度,則表明存在中斷。在這種情況下,我使用 range() 創(chuàng)建一個虛擬列表,其中包含所有缺失的 x 值,邊界是循環(huán)被破壞的第 k 個“元組”,+1 因為我不想相同的 x 值兩次,以及下一個元素。然而,雖然這個函數(shù)可以工作,但代碼有點丑陋,而且就像我說的,它只適用于一個 y 坐標(biāo)。解決后者是最重要的部分,但如果有人有建議改進(jìn)此代碼或首先使用其他方法,請告訴我。結(jié)果列表中坐標(biāo)的順序并不重要。e:如果是“唯一的 y 坐標(biāo)”,例如“元組”[20, 51],則不應(yīng)更改任何內(nèi)容,因為“中間”沒有元素。
1 回答

神不在的星期二
TA貢獻(xiàn)1963條經(jīng)驗 獲得超6個贊
如果我理解正確的話,您想要填充x坐標(biāo)中的空白,并在每次y坐標(biāo)更改時重置。
下面是一個 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]
這使用生成器使代碼更容易一些,因此如果您想要一個列表,則需要將調(diào)用包裝起來list()以實現(xiàn)這一點:
result = list(fill_gaps(coords))
該解決方案需要按照您的說明對坐標(biāo)進(jìn)行排序。
添加回答
舉報
0/150
提交
取消