2011-11-16 47 views
5

Estoy usando Estudiante intermedio con Lambda en DrRacket, me preguntaba cómo se eliminarían los duplicados en una lista, mientras se mantiene el orden. Por ejemplo, (remove-dup (list 2 5 4 5 1 2)) produciría (list 2 5 4 1). Hasta ahora, tengo esto:Cómo deshacerse de los duplicados en una lista, pero mantenga el orden

(define (remove-duplicates lst) 
    (cond 
    [(empty? lst) empty] 
    [(member? (first lst) (rest lst)) 
    (remove-duplicates (rest lst))] 
    [else (cons (first lst) (remove-duplicates (rest lst)))])) 

, pero hay un problema ya que no mantiene el orden. ¿Alguien me puede apuntar en la dirección correcta? Gracias por tu tiempo.

+4

En realidad, parece que * does * preserva el orden, simplemente no conserva el primero de los elementos duplicados. ¿Estás seguro de que tu solución es incorrecta? –

+0

desafortunadamente la solución es incorrecta. Por ejemplo, si tengo remove-duplicates (1 2 5 1 4), quiero (list 1 2 5 4), en lugar del valor real de (list 2 5 1 4). Perdón por el mal ejemplo. –

+0

Estaba pensando en hacer algo así como contras el 1er de la lista, y luego usar filtro en el resto de la lista con el 1er número. Excepto, no sé cómo implementar eso jaja. –

Respuesta

0

SRFI-1 tiene delete-duplicates, aunque es ineficaz. (No estoy muy familiarizado con la raqueta, pero seguramente tiene SRFI-1, y la fuente ...)

http://srfi.schemers.org/srfi-1/srfi-1.html#delete-duplicates

+0

Eché un vistazo al sitio web, pero creo que el código fuente proporcionado no funciona en Racket. –

+2

Puede usar 'srfi/1' en Racket simplemente agregando' (require srfi/1) 'a su programa. Sin embargo, 'remove-duplicates' como se menciona en la primera respuesta es incluso más fácil de obtener: está ahí por defecto en Racket. –

0

Ejecutar secuencialmente por la lista, la inserción de cada elemento en una tabla hash o de otro diccionario. Si intenta insertar un elemento que ya está en la tabla hash, no lo agregue a la lista saliente.

10

Si su objetivo es conseguir el funcionamiento de la funcionalidad, y no una pregunta tarea, entonces no tiene que hacer nada, sólo tiene que utilizar remove-duplicates:

Welcome to Racket v5.2. 
-> (remove-duplicates (list 2 5 4 5 1 2)) 
'(2 5 4 1) 
+0

Tengo la raqueta 6.0.1 pero me dice que la función no está definida –

+1

Necesita usar el lenguaje habitual, no los idiomas de los estudiantes. –

0

Lo que hay que hacer es comparar a la inversa ordena todo el tiempo Puede usar la función reverse que devuelve una lista en orden inverso. De esta forma, siempre eliminarás la segunda ocurrencia + de un elemento y no el primero. Aquí hay un ejemplo, sin embargo, está usando let y if y no una expresión cond.

http://www.cs.bgu.ac.il/~elhadad/scheme/duplicates.html

Buena suerte con su tarea :)

0

no estoy seguro si esto es la tarea, pero en caso de que sea voy a publicar sólo la idea. Si no es así dime y puedo poner una solución aquí.

Lo que necesita es realizar un seguimiento de los elementos únicos que encuentre, puede hacerlo utilizando una lista auxiliar, como un acumulador, para realizar un seguimiento de los que encontró hasta el momento.

Cada vez que mira otro elemento, compruebe si está en la lista auxiliar. En caso de que no sea agregarlo a la lista auxiliar.

Terminará con un orden inverso al que está tratando de encontrar, para que pueda (invertir) y tendrá su respuesta.

+0

Será mejor que prefiera un hash configurado en una lista para guardar los elementos que ha visto. Con una lista, la función es 'Theta (n^2)'. Con un conjunto de hash, es 'Theta (n)'. – Thumbnail

0

hmm sólo tenía un examen de la raqueta hace poco,:/

el 'estándar' remove-duplicates funciona bien, pero yo estaba usando bastante-grande en DrRacket por lo que tuvo que ser cargado mediante (require racket/list)

Aquí se presenta una forma alternativa :)

mediante mutación (no realmente en el espíritu de la raqueta, pero .. funciona.)

(define (set l) 
     (define the-set '()) 
      (begin (for-each 
         (lambda (x) 
          (if (member x the-set) 
           #t 
          (set! the-set (cons x the-set)))) 
         l) 
        (reverse the-set))) 

esperanza esta ayuda ... ¡salud!

4

Ésta es la solución:

(define (remove-duplicates lon) 
    (foldr (lambda (x y) (cons x (filter (lambda (z) (not (= x z))) y))) empty lon)) 
0

pregunta antiguo, pero esto es una implementación de la idea de J-Y.

(define (dup-rem lst) 
    (cond 
    [(empty? lst) empty] 
    [else (cons (first lst) (dup-rem (filter (lambda (x) (not (equal? (first lst) x))) lst)))])) 
Cuestiones relacionadas