回答
在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]
No. cons
是Lisp-like語言的實現細節;它在Python中並不存在任何有意義的意義。
所以沒有辦法 「凝結」 就像從列表'[1,2,[3,4,5,[4,1]]]'來'[1,2,3,4, 5,4,1]'? – tekknolagi
有,但是'cons'不是。請參閱:http://stackoverflow.com/questions/406121/flattening-a-shallow-list-in-python – duskwuff
您可以很平凡定義的行爲很像0類:
class Cons(object):
def __init__(self, car, cdr):
self.car = car
self.cdr = cdr
然而,這將是建立基本的數據結構,其中Python是不是優化的非常「重量級」的方式,所以我會預計結果會比在Lisp中做類似的工作更多地佔用CPU /內存。
請注意,Python的列表是作爲向量實現的,而不是鏈接列表。你可以做lst.insert(0, val)
,但是那個操作是O(n)。
如果您想要一個更像鏈接列表的數據結構,請嘗試使用Deque。
警告提示:以下內容可能不實用!
實際上,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。只是開個玩笑:)
- 1. Lisp的差異(利弊,A(利弊'B 'C))和(缺點' A「(BC))
- 2. 利弊
- 3. 利弊
- 4. 與利弊()
- 5. SELECT * - 利弊
- 6. 靜態類利弊
- 7. MySQL觸發利弊
- 8. Flink利用gradle代替maven的利弊
- 9. 方案利弊和長度
- 10. 外觀模式利弊
- 11. 光子VMware的利弊
- 12. 利弊的RubyMine和TextMate的
- 13. tkinter和wxWidgets的利弊?
- 14. Xpath的選擇差異:利弊
- 15. 在方案利弊和點符號
- 16. 轉換爲long long,利弊C
- 17. 利弊多站點的Drupal設置
- 18. 在虛擬機下編程 - 利弊
- 19. 平原插入VS PLSQL插入 - 利弊
- 20. 無法理解代理人利弊
- 21. 直接登錄鏈接利弊
- 22. 有人試過neo4j vs泰坦 - 利弊
- 23. 什麼是WCF(以及利弊)?
- 24. 整合的Symfony和Joomla,利弊
- 25. 靜態SQL方法的利弊
- 26. GLib v APR的每個利弊
- 27. 利弊/來自網絡位置
- 28. Sencha觸摸vs Ionic框架利與弊
- 29. 利弊,列表和mpair球拍
- 30. 利弊在ASP.NET MVC應用程序
使用Python的列表和循環來模擬Lisp的列表看起來像矯枉過正。另外,正如@alberge所指出的,這個答案使用數組列表而不是鏈表。我希望[這篇文章](http://www.jotflow.com/jot/PythonS-Cons-Car--Cdr/18)提供了一個更好的解決方案。 –