GOOGLE ADS

miércoles, 13 de abril de 2022

Cómo eliminar duplicados de una lista de tuplas pero manteniendo el orden original

Quiero eliminar las tuplas redundantes pero conservar el orden de aparición. Miré preguntas similares. Esta pregunta Buscar filas únicas en numpy.array parecía muy prometedora, pero de alguna manera no funcionó para mí.

Podría usar pandas como en esta respuesta ( https://stackoverflow.com/a/14089586/566035 ) pero prefiero no usar pandas para que el ejecutable generado por py2exe sea pequeño.

import numpy as np
data = [('a','z'), ('a','z'), ('a','z'), ('1','z'), ('e','z'), ('c','z')]
#What I want is:
array([['a', 'z'],
['1', 'z'],
['e', 'z'],
['c', 'z']],
dtype='|S1')
#What I have tried:
# (1) numpy.unique, order not preserved
np.unique(data)
array([['a', 'z'],
['c', 'z'],
['1', 'z'],
['e', 'z']],
dtype='|S1')
# (2) python set, order not preserved
set(data)
set([('1', 'z'), ('a', 'z'), ('c', 'z'), ('e', 'z')])
# (3) answer here: https://stackoverflow.com/a/16973510/566035, order not preserved
a = np.array(data)
b = np.ascontiguousarray(a).view(np.dtype((np.void, a.dtype.itemsize * a.shape[1])))
_, idx = np.unique(b, return_index=True)
a[idx]
array([['1', 'z'],
['a', 'z'],
['c', 'z'],
['e', 'z']],
dtype='|S1')


Solución del problema

Esto no es excelente en términos de eficiencia, pero es un código legible muy simple y puede funcionar para listas más pequeñas:

sorted(set(data), key=data.index)

No hay comentarios.:

Publicar un comentario

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...