Tengo una lista de elementos '(a b c) y quiero encontrar si (verdadero o falso) x está en él, donde x puede ser' a o 'd, por ejemplo. ¿Hay una función incorporada para esto?¿Cuál es la función de Esquema para encontrar un elemento en una lista?
Respuesta
Si necesita comparar utilizando uno de los operadores de equivalencia de construcción, puede usar memq
, memv
, or member
, dependiendo de si desea buscar la igualdad usando eq?
, eqv?
, or equal?
, respectivamente.
> (memq 'a '(a b c))
'(a b c)
> (memq 'b '(a b c))
'(b c)
> (memq 'x '(a b c))
#f
Como puede ver, estas funciones devuelven la sublista comenzando en el primer elemento coincidente si encuentran un elemento. Esto se debe a que si está buscando una lista que puede contener booleanos, debe ser capaz de distinguir el caso de encontrar un #f
del caso de no encontrar el elemento que está buscando. Una lista es un valor verdadero (el único valor falso en el Esquema es #f
) para que pueda utilizar el resultado de memq
, memv
o member
en cualquier contexto esperando un booleano, como una expresión if
, cond
, and
, o or
.
> (if (memq 'a '(a b c))
"It's there! :)"
"It's not... :(")
"It's there! :)"
¿Cuál es la diferencia entre las tres funciones diferentes? Se basa en la función de equivalencia que utilizan para la comparación. eq?
(y por lo tanto memq
) prueba si dos objetos son el mismo objeto subyacente; es básicamente equivalente a una comparación de puntero (o comparación de valor directo en el caso de enteros). Por lo tanto, dos cadenas o listas que parecen iguales no pueden ser eq?
, ya que están almacenadas en diferentes lugares de la memoria. equal?
(y por lo tanto member?
) realiza una comparación profunda en listas y cadenas, por lo que básicamente dos elementos que impriman lo mismo serán equal?
.eqv?
es como eq?
para casi cualquier cosa menos números; para los números, dos números que son numéricamente equivalentes serán siempre eqv?
, pero pueden no ser eq?
(esto es debido a bignums y números racionales, que pueden ser almacenados de manera tal que no van a ser eq?
)
> (eq? 'a 'a)
#t
> (eq? 'a 'b)
#f
> (eq? (list 'a 'b 'c) (list 'a 'b 'c))
#f
> (equal? (list 'a 'b 'c) (list 'a 'b 'c))
#t
> (eqv? (+ 1/2 1/3) (+ 1/2 1/3))
#t
(Nótese que algunas comportamiento de las funciones no está definido por la especificación, y por lo tanto pueden diferir de una implementación a otra; he incluido ejemplos que deberían funcionar en cualquier R Esquema RS compatible que implementa el número exacto racionales)
Si necesita buscar un artículo en una lista usando un predicado de equivalencia e diferente de uno de los construidos en los, entonces puede que desee find
o find-tail
de SRFI-1:
> (find-tail? (lambda (x) (> x 3)) '(1 2 3 4 5 6))
'(4 5 6)
¿Para qué sirve el nombre de la función 'memq'? – Freewind
'memq' es una de las familias de funciones' member', que busca un elemento en una lista basada en algún tipo de equivalencia (como los otros mencionados, 'member' y' memv'). El 'q',' v', o el nombre completo lo conectan con las tres funciones de equivalencia que utilizan; 'memq' usa' eq? 'para probar la equivalencia,' memv' usa 'eqv?' para probar la equivalencia, y 'member' usa' equal? 'para probar la equivalencia. Consulte la documentación vinculada sobre las funciones de equivalencia para ver la diferencia entre ellas. –
¡Gracias! Así que 'memq' se puede considerar como' mem-q', y 'memv' como' mem-v' – Freewind
Usted está buscando "encontrar"
Básico - El caso más simple es sólo (Encontrar lista de entradas), generalmente utilizados como un predicado: "es la entrada en la lista?". Si logra encontrar el elemento en cuestión, devuelve el primer elemento coincidente en lugar de solo "t". (tomado del segundo enlace.)
http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node145.html
-o-
La pregunta fue sobre el esquema, no Common Lisp. –
Bueno, etiquetó a LISP. –
Lea el título: '¿Qué es la función SCHEME para encontrar un elemento en una lista?'. Scheme es un dialecto en la familia de lenguajes Lisp. –
Aquí hay una manera:
> (cond ((member 'a '(a b c)) '#t) (else '#f))
#t
> (cond ((member 'd '(a b c)) '#t) (else '#f))
#f
miembro vuelve todo a partir de los que el elemento es o #f. Un cond se usa para convertir esto en verdadero o falso.
'# t' está bien también, en lugar de' '# t' –
No sé si hay una función integrada, pero se puede crear una:
(define (occurrence x lst)
(if (null? lst) 0
(if (equal? x (car lst)) (+ 1 (occurrence x (cdr lst)))
(occurrence x (cdr lst))
)
)
)
Ỳ obtendrá a cambio el número de ocurrencias de x
en la lista. puede ampliarlo con true
o false
también.
- 1. Esquema: valor de cambio de un elemento en una lista
- 2. ¿Cómo encontrar el índice de un elemento en una lista?
- 3. Agregando un elemento a la Lista en el Esquema
- 4. ¿Cuál es más rápido para encontrar un elemento en una tabla hash o en una lista ordenada?
- 5. ¿Encontrar un elemento de una lista cuando la lista está en un diccionario?
- 6. ¿Cuál es la forma más pitónica de sacar un elemento aleatorio de una lista?
- 7. ¿Cuál es la manera pitónica de contar la ocurrencia de un elemento en una lista?
- 8. encontrar el elemento insertado en la lista
- 9. eliminando el último elemento de una lista (esquema)
- 10. Encontrar un elemento en una lista <> con C#
- 11. ¿Cuál es la mejor manera de incluir condicionalmente un elemento en una lista?
- 12. ¿Cuál es la manera más fácil de agregar un elemento al final de la lista?
- 13. ¿Hay una función R para encontrar el índice de un elemento en un vector?
- 14. Función de esquema de desplazamiento como una lista
- 15. Python: encontrar un elemento en una matriz
- 16. ¿Cuál es la complejidad temporal de esta función en el esquema?
- 17. Usando Linq para encontrar el elemento después de un elemento especificado en una colección
- 18. Cuál es el identificador único para un elemento DOM/nodo
- 19. ¿Cuál es el comando para encontrar script de una función existente en postgresql?
- 20. ¿Cómo encontrar la posición de un elemento en una lista, en Python?
- 21. ¿Cómo declarar una variable dentro de una función de esquema?
- 22. Python: Para cada elemento de la lista se aplica una función a través de la lista de
- 23. Esquema XML para un elemento fijo con un atributo fijo?
- 24. Como encontrar la posición de índice de un elemento en una lista cuando contiene retornos verdaderos
- 25. Python- encontrar el elemento con eventos máximo en una lista
- 26. ¿Qué función de la biblioteca std hay para buscar binariamente un vector y encontrar un elemento?
- 27. Seleccionar un solo elemento de una lista
- 28. OCaml inserta un elemento en la lista
- 29. Mapa/ArrayList: cuál es más rápido para buscar un elemento
- 30. C++ función para elegir de una lista donde cada elemento tiene una probabilidad distinta
Uso del lenguaje para encontrarlo: http://schemers.org/Documents/Standards/R5RS//HTML/r5rs-ZH-9.html#%_sec_6.3.2 –