2011-11-10 1 views
8

파이썬에서 cons과 동등한 기능이 있습니까? (2.5 이상인 모든 버전)LISP가 파이썬에서 사용됨

그렇다면 내장되어 있습니까? 아니면 easy_install 모듈을 구해야합니까?

답변

7

파이썬에서는 Lisp 스타일의 링크 목록보다 배열 기반 list 클래스를 사용하는 것이 더 일반적입니다. 두 모델을 서로 변환하는 것이 그리 어렵지 않습니다.

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

Lisp의 목록을 에뮬레이트하기 위해 Python의 목록과 루프를 사용하면 과도한 것처럼 보입니다. 게다가 @alberge가 지적했듯이이 대답은 링크 된 목록 대신 배열 목록을 사용합니다. 나는 [이 에세이] (http://www.jotflow.com/jot/PythonS-Cons-Car--Cdr/18)가 더 나은 해결책을 제공하기를 바랍니다. –

1

No. cons은 Lisp 계열 언어의 구현 세부 사항입니다. Python에서는 의미있는 의미로 존재하지 않습니다.

+0

그래서''[1, 2, [3, 4, 5, [4,1]]]'과 같은리스트를''1, 2, 3, 4, 5, 4, 1]'? – tekknolagi

+1

하지만 죄송합니다. 참조 : http://stackoverflow.com/questions/406121/flattening-a-shallow-list-in-python – duskwuff

2

당신은 아주 하찮게 많은 cons처럼이 작동하는 클래스를 정의 할 수 있습니다 :

class Cons(object): 
    def __init__(self, car, cdr): 
     self.car = car 
     self.cdr = cdr 

그러나이 파이썬에 최적화되지 않은 기본 데이터 구조를 구축 할 수있는 매우 '헤비급'방법이 될 것이다, 그래서 나는 것 결과가 Lisp에서 비슷한 일을하는 것보다 훨씬 많은 CPU/메모리 집약적 일 것이라고 예상하십시오.

3

파이썬의 목록은 링크 된 목록이 아니라 벡터로 구현된다는 점에 유의하십시오. lst.insert(0, val)을 할 수 있지만 그 작업은 O (n)입니다.

링크 된 목록처럼 작동하는 데이터 구조를 원할 경우 Deque을 사용해보십시오.

5

경고 : 아래의 자료는 실제와 다를 수 있습니다.

실제로 cons은 Lisp에서 원시적 일 필요는 없지만 λ로 생성 할 수 있습니다. 자세한 내용은 Use of lambda for cons/car/cdr definition in SICP을 참조하십시오.

이제
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) 

, car(cons("a", "b")) 당신에게 'a'를 제공해야합니다 : 파이썬에서, 그것은으로 변환됩니다.

어때? 접두사 체계 :

물론, cdr 재귀를 사용하여 건물 목록을 시작할 수 있습니다. nil을 파이썬에서 빈 쌍으로 정의 할 수 있습니다.

def nil(): return() 

파이썬에서는 =을 사용하여 변수를 바인드해야합니다. 내가 맞습니까? 이후 변수를 변경할 수 있습니다, 오히려 상수 함수를 정의 할 수 있습니다.

물론 이것은 Pythonic이 아니지만 Lispy입니다. 실용적이지 않고 우아합니다.

연습 : Python으로 Scheme의 목록 라이브러리 http://srfi.schemers.org/srfi-1/srfi-1.html을 구현하십시오. 농담 :)

관련 문제