2011-11-10 12 views
8

¿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?

Respuesta

7

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] 
+1

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. –

1

cons es un detalle de implementación de lenguajes similares a Lisp; no existe en ningún sentido significativo en Python.

+0

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

+1

Hay, pero 'contra' no es eso. Ver: http://stackoverflow.com/questions/406121/flattening-a-shallow-list-in-python – duskwuff

2

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.

3

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.

5

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 :)