2011-11-10 223 views
8

在Python中是否有相當於cons? (高於2.5的任何版本)LISP利弊python

如果是這樣,是否內置?或者我需要easy_install確實獲得一個模塊?

回答

7

在Python中,使用基於數組的list類比Lisp樣式的鏈表更典型。但在它們之間轉換並不難:

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

使用Python的列表和循環來模擬Lisp的列表看起來像矯枉過正。另外,正如@alberge所指出的,這個答案使用數組列表而不是鏈表。我希望[這篇文章](http://www.jotflow.com/jot/PythonS-Cons-Car--Cdr/18)提供了一個更好的解決方案。 –

1

No. cons是Lisp-like語言的實現細節;它在Python中並不存在任何有意義的意義。

+0

所以沒有辦法 「凝結」 就像從列表'[1,2,[3,4,5,[4,1]]]'來'[1,2,3,4, 5,4,1]'? – tekknolagi

+1

有,但是'cons'不是。請參閱:http://stackoverflow.com/questions/406121/flattening-a-shallow-list-in-python – duskwuff

2

您可以很平凡定義的行爲很像0​​類:

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

然而,這將是建立基本的數據結構,其中Python是不是優化的非常「重量級」的方式,所以我會預計結果會比在Lisp中做類似的工作更多地佔用CPU /內存。

3

請注意,Python的列表是作爲向量實現的,而不是鏈接列表。你可以做lst.insert(0, val),但是那個操作是O(n)。

如果您想要一個更像鏈接列表的數據結構,請嘗試使用Deque

5

警告提示:以下內容可能不實用!

實際上,cons在Lisp中不需要是原始的,你可以用λ來構建它。 有關詳細信息,請參閱Use of lambda for cons/car/cdr definition in SICP。在Python中,它被翻譯成:

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定義爲Python中的空對。

def nil(): return() 

請注意,您必須在Python中使用=綁定變量。我對嗎?由於它可能會改變變量,我寧願定義常量函數。

當然,這不是Pythonic,而是Lispy,不那麼實用而優雅。

練習:在Python中實現Scheme的List Library http://srfi.schemers.org/srfi-1/srfi-1.html。只是開個玩笑:)