Python中是否有等效的cons
? (任何高于2.5的版本)
如果是这样,它是否内置?或者我需要easy_install
获取模块吗?
答案 0 :(得分: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 :(得分:7)
警告:以下材料可能不实用!
实际上,width: 500px
在Lisp中不需要是原始的,你可以用λ构建它。
有关详细信息,请参阅Use of lambda for cons/car/cdr definition in SICP。在Python中,它被翻译为:
cons
现在,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
定义为Python中的空对。
nil
请注意,您必须使用Python中的def nil(): return ()
绑定变量。我对吗?因为它可能会改变变量,所以我宁愿定义常量函数。
当然,这不是Pythonic而是Lispy,不那么实用而且优雅。
练习:在Python中实现Scheme的列表库http://srfi.schemers.org/srfi-1/srfi-1.html。开个玩笑:)
答案 2 :(得分:3)
请注意,Python的列表实现为向量,而不是链接列表。您可以lst.insert(0, val)
,但该操作是O(n)。
如果您希望数据结构的行为更像链接列表,请尝试使用Deque。
答案 3 :(得分:2)
您可以非常简单地定义一个与cons
非常相似的类:
class Cons(object):
def __init__(self, car, cdr):
self.car = car
self.cdr = cdr
然而,这将是构建基本数据结构的一种非常“重量级”的方式,Python没有针对它进行优化,所以我希望结果比在Lisp中做类似的事情要多得多CPU /内存。
答案 4 :(得分:1)
没有。 cons
是类似Lisp的语言的实现细节;它在Python中没有任何有意义的意义。
答案 5 :(得分:1)
在Python 3中,您可以使用splat运算符*
通过编写[x, *xs]
来简化操作。例如:
>>> x = 1
>>> xs = [1, 2, 3]
>>> [x, *xs]
[1, 1, 2, 3]
如果您希望将其定义为函数,那也很容易:
def cons(x, xs):
return [x, *xs]