2011-01-20 15 views
7

Tengo una clase que contiene una lista de cadenas. Diga:¿Cómo asegurar que la lista contiene elementos únicos?

ClassName: 
- list_of_strings 

Necesito forzar que esta lista de cadenas contenga elementos únicos. Desafortunadamente, no puedo cambiar esta list_of_strings por otro tipo, como un conjunto.

En la función addToList(str_to_add), quiero garantizar la exclusividad de la cadena. ¿Cómo puedo hacer esto mejor? ¿Sería práctico agregar la cadena que se agrega a la lista, convertirla a un conjunto, luego volver a una lista y luego reasignarla al objeto?

Aquí es el método que necesito para actualizar:

def addToList(self, str_to_add): 
    self.list_of_strings.append(str_to_add) 

Gracias!

+0

* ¿Por qué * no puedes usar un conjunto? Parece ser el tipo de datos apropiado aquí. –

+0

¿Puede la lista estar en orden ordenado? Si es así, entonces puedes usar una búsqueda binaria. De lo contrario, está atascado con algún algoritmo de orden lineal, por lo que la conversión a un conjunto puede ser lo más fácil si la velocidad absoluta no es un requisito. – chrisaycock

+0

Es de suponer que quiere conservar el orden, o ya hay un código que espera una lista ordenada en lugar de un conjunto. Un conjunto ordenado o una lista única es un tipo de datos razonable. – bnaul

Respuesta

21
def addToList(self, str_to_add): 
    if str_to_add not in self.list_of_strings: 
     self.list_of_strings.append(str_to_add) 
+0

Ahh ... tienes razón y esto es correcto para el problema que describí. De manera embarazosa, me di cuenta de que describía mal mi problema y el problema que tengo es completamente diferente. – Cuga

1

Usted de hecho podría hacer la operación de lista de tareas-set-a-lista que describes, pero también se puede utilizar el operador in para comprobar si el elemento ya está en la lista antes de añadir él.

4

Compruebe la presencia de la cadena en la lista con in, o utilice un set en paralelo que puede verificar y agregar.

+0

El conjunto paralelo es una idea interesante. – kindall

+0

Este es probablemente más eficiente en términos de las búsquedas, especialmente si la lista es grande. – ffledgling

0

Una posible forma de hacerlo sería crear un conjunto de hash e iterar a través de la lista, agregando los elementos al conjunto; una segunda iteración podría usarse para eliminar cualquier duplicado.

0

Tal vez podemos hacer como esto:

addToList def (auto, str_to_add):

try: 
    self.list_of_strings.index(str_to_add) 
except: 
    self.list_of_strings.append(str_to_add) 

Bueno, no sé si es el mismo mecanismo con if/else todavía.

Cuestiones relacionadas