Использование кортежей для удаления дубликатов координат из списка в VBA - PullRequest
2 голосов
/ 19 февраля 2020

У меня есть два массива, заполненных значениями X и Y. Значения извлекаются из текстовых полей, которые заполняет пользователь.

Эти значения (x1, y1), (y1, y2), (x_nth, y_nth) построены, где n - количество точек в моих массивах.

Я хочу пройти через эти пары координат и найти те, которые перекрывают друг друга . Как только я нахожу определенную точку перекрытия, я могу изменить размер маркера дубликатов, чтобы он был больше, чтобы читатель мог видеть, как часто точка повторяется. Прямо сейчас я просто хочу выполнить sh первое.

Я не знаком с VBA, я работаю в основном в Python. Ниже приведен пример кода, который работает в python.

x = [1,2,2,4,5,5,5]
y = [1,3,3,4,5,5,5]
pts = []
for i in range(len(x)):
    cX = x[i]
    cY = y[i]
    if (cX, cY) in pts:
        print("duplicate")
        print(cX, cY)
        #plot this point on scatter
        #increase marker size for this particular point
    else:
        pts.append((cX, cY))
print(pts)

Вывод

Duplicate
2 3
Duplicate
5 5
Duplicate
5 5
[(1,1), (2, 3), (4,4), (5,5)]

1 Ответ

1 голос
/ 19 февраля 2020

Я просто быстро все это сложил, но это делает работу. Python лучше работает с данными, чем vba (больше типов данных, таких как списки и кортежи). Есть несколько способов сделать это, я просто решил использовать двумерный массив.

Dim array_Tuple() As Variant, i As Integer, xsplit, ysplit
Dim sLength As Integer, x As String, y As String, v
Dim bool As Boolean

x = "1,2,2,4,5,5,5"
y = "1,3,3,4,5,5,5"

xsplit = Split(x, ",")
ysplit = Split(y, ",")
count = 0

On Error Resume Next
For i = 0 To UBound(xsplit)
bool = True

    For j = 0 To count
        If xsplit(i) = array_Tuple(1, j) And ysplit(i) = array_Tuple(2, j) Then
            If Not err.Number <> 0 Then
                bool = False
            End If
            err.Clear
        End If
    Next

If bool Then
    count = count + 1
    ReDim Preserve array_Tuple(1 To 2, 1 To count)
    array_Tuple(1, count) = xsplit(i)
    array_Tuple(2, count) = ysplit(i)

    Debug.Print array_Tuple(1, count) & "," & array_Tuple(2, count)
End If

Next
On Error GoTo 0
...