¿Hay un equivalente de cons
en Python? (cualquier versión anterior a la 2.5)CONS LISP en python
Si es así, ¿está incorporada? ¿O necesito easy_install
obtener un módulo?
¿Hay un equivalente de cons
en Python? (cualquier versión anterior a la 2.5)CONS LISP en python
Si es así, ¿está incorporada? ¿O necesito easy_install
obtener un módulo?
En Python, es más típico usar la clase list
basada en arreglos que las listas vinculadas al estilo Lisp. Pero no es demasiado difícil convertir entre ellos:
def cons(seq):
result = None
for item in reversed(seq):
result = (item, result)
return result
def iter_cons(seq):
while seq is not None:
car, cdr = seq
yield car
seq = cdr
>>> cons([1, 2, 3, 4, 5, 6])
(1, (2, (3, (4, (5, (6, None))))))
>>> iter_cons(_)
<generator object uncons at 0x00000000024D7090>
>>> list(_)
[1, 2, 3, 4, 5, 6]
Nº cons
es un detalle de implementación de lenguajes similares a Lisp; no existe en ningún sentido significativo en Python.
así que no hay forma de "condensar" listas como '[1, 2, [3, 4, 5, [4, 1]]]' a '[1, 2, 3, 4, 5, 4, 1] '? – tekknolagi
Hay, pero 'contra' no es eso. Ver: http://stackoverflow.com/questions/406121/flattening-a-shallow-list-in-python – duskwuff
Se pueden definir bastante trivial una clase que se comporta como cons
:
class Cons(object):
def __init__(self, car, cdr):
self.car = car
self.cdr = cdr
Sin embargo, esto será una manera muy 'peso pesado' para construir estructuras de datos básicos, que Python no está optimizado para, por lo que lo haría espera que los resultados sean mucho más intensivos en CPU/memoria que hacer algo similar en Lisp.
Tenga en cuenta que las listas de Python se implementan como vectores, no como listas vinculadas. Puede hacer lst.insert(0, val)
, pero esa operación es O (n).
Si desea una estructura de datos que se comporta más como una lista vinculada, intente con un Deque.
ADVERTENCIA AHORA: ¡El material a continuación puede no ser práctico!
En realidad, cons
no necesita ser primitivo en Lisp, puede compilarlo con λ. Ver Use of lambda for cons/car/cdr definition in SICP para más detalles. En Python, se traduce a:
def cons(x, y):
return lambda pair: pair(x, y)
def car(pair):
return pair(lambda p, q: p)
def cdr(pair):
return pair(lambda p, q: q)
Ahora, car(cons("a", "b"))
debería darle 'a'
.
¿Cómo es eso? Esquema de prefijo :)
Obviamente, puede comenzar la creación de lista utilizando la recursión cdr
. Puede definir nil
como el par vacío en Python.
def nil(): return()
Observe que debe unirse variable usando =
en Python. ¿Estoy en lo cierto? Como puede mutar la variable, prefiero definir la función constante.
Por supuesto, esto no es pitónico, pero Lispy, no es tan práctico y elegante.
Ejercicio: Implementar la biblioteca de listas http://srfi.schemers.org/srfi-1/srfi-1.html de Scheme en Python. Es una broma :)
Usar listas y bucles de Python para emular las listas de Lisp parece exagerado. Además, como señaló @alberge, esta respuesta emplea listas de matrices en lugar de listas enlazadas. Espero que [este ensayo] (http://www.jotflow.com/jot/PythonS-Cons-Car--Cdr/18) brinde una mejor solución. –