es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo usar un diccionario para almacenar elementos únicos?

He leído la documentación pero lo principal que estoy encontrando es exists, lo cual funcionaría muy bien si no necesitara preservar el orden de las claves. Esencialmente, cada índice/registro del diccionario hace un identificador único. Por lo tanto, las claves individuales podrían ser iguales siempre y cuando la línea completa sea única.

Dim d
Set d = CreateObject("Scripting.Dictionary")
y = 0
For i = 2 To Cells(2, 1).End(xlDown).Row
  'código para verificar la unicidad de los valores
  d.Add "Index", y
  d.Add "Date", Cells(i, 3)
  d.Add "FirstName", Cells(i, 6)
  d.Add "LastName", Cells(i, 7)
  y = y + 1
Next i

El diccionario se vería así:
lang-txt
Index 1
Date 29/12/2021
FirstName John
LastName Smith

Entonces, usar exists no funcionaría porque podría tener varios firstnames llamados John. Pensé en usar exists anidados, pero no creo que eso funcione tampoco.

Supongo que la pregunta principal es: ¿es el diccionario la mejor manera de hacer esto?
Supongo que todo esto es solo una forma elegante de eliminar duplicados en una lista, ¿sería mejor usar RemoveDuplicates en un rango?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Basado en el requisito de preservar el orden de las claves y asegurar la unicidad de la línea completa, el uso de exists o exists anidados en un diccionario puede no ser el mejor enfoque. Una alternativa podría ser concatenar los valores de cada registro como una cadena y usarlos como claves en el diccionario. Esto aseguraría que la línea completa sea única y se preserve el orden de las claves.

    Código de ejemplo:

    Dim d As Object
    Set d = CreateObject("Scripting.Dictionary")
    y = 0
    For i = 2 To Cells(2, 1).End(xlDown).Row
        'código para verificar la unicidad de los valores
        clave = CStr(Cells(i, 3)) & "|" & CStr(Cells(i, 6)) & "|" & CStr(Cells(i, 7)) 'concatenar los valores como una cadena
        If Not d.Exists(clave) Then 'verificar si la clave ya existe
            d.Add clave, y 'agregar par clave-valor al diccionario
            y = y + 1
        End If
    Next i
    

    El diccionario resultante se vería así:

    Índice  0
    Clave   29/12/2021|John|Smith
    

    Usar RemoveDuplicates en un rango también podría ser una opción viable dependiendo del tamaño de los datos y del nivel de personalización requerido.

Comments are closed.