【问题标题】:Using tuples to remove duplicate coordinates from a list in VBA使用元组从 VBA 列表中删除重复坐标
【发布时间】:2020-06-03 20:01:37
【问题描述】:

我有两个填充了 X 和 Y 值的数组。这些值是从用户填写的文本框中提取的。

这些值 (x1,y1), (y1,y2), (x_nth, y_nth) 被绘制出来,其中 n 是我的数组中的点数。

我想遍历这些坐标对并找到相互重叠的坐标。一旦找到确定的重叠点,我就可以将重复标记的大小更改为更大,以便读者可以看到重复点的频率。现在我只想完成前者。

我不熟悉 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)]

【问题讨论】:

    标签: python vba duplicates


    【解决方案1】:

    我只是很快就将它拼凑在一起,但它确实完成了工作。 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
    

    【讨论】:

    • 我能多解释一下它是如何工作的吗?下一个 on Error Resume Next 的目的是什么?将其包括在内是否只是一种好习惯?
    • on Error Resume Next 的目的是什么? :在这种情况下,没有内置函数来检查我们的新值是否已经在数组中。因此,我们第一次通过它时会出错(array_Tuple 中没有任何内容)。这将继续到下一行。再一次,可能有更好的方法只是可行的方法。
    • 我能多解释一下它是如何工作的吗?:我们正在循环遍历“列表”的长度并将 x 和 y 添加到数组中。首先,我们循环遍历整个当前数组,这样我们就不会重复值,如果我们通过测试,则会添加值区域。
    猜你喜欢
    • 2017-03-03
    • 2019-06-12
    • 2018-10-17
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多