【发布时间】:2011-11-10 01:12:26
【问题描述】:
在 Python 中是否有 cons 的等价物? (2.5以上的任何版本)
如果是,它是内置的吗?还是我需要easy_install 获取模块?
【问题讨论】:
在 Python 中是否有 cons 的等价物? (2.5以上的任何版本)
如果是,它是内置的吗?还是我需要easy_install 获取模块?
【问题讨论】:
提前警告:以下材料可能不实用!
实际上,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 递归开始构建列表。您可以在 Python 中将 nil 定义为空对。
def nil(): return ()
请注意,您必须在 Python 中使用 = 绑定变量。我对吗?由于它可能会改变变量,我宁愿定义常量函数。
当然,这不是 Pythonic 而是 Lispy,既不实用又优雅。
练习:用Python实现Scheme的列表库http://srfi.schemers.org/srfi-1/srfi-1.html。开个玩笑:)
【讨论】:
在 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]
【讨论】:
请注意,Python 的列表是作为向量实现的,而不是作为链表。你可以做lst.insert(0, val),但是这个操作是 O(n)。
如果您想要一个更像链表的数据结构,请尝试使用Deque。
【讨论】:
您可以非常简单地定义一个行为类似于cons 的类:
class Cons(object):
def __init__(self, car, cdr):
self.car = car
self.cdr = cdr
然而,这将是构建基本数据结构的一种非常“重量级”的方法,Python 并未针对该数据结构进行优化,因此我预计结果会比在 Lisp 中执行类似操作更占用 CPU/内存。
【讨论】:
在 Python 3 中,您可以使用 splat 运算符 * 通过编写 [x, *xs] 来简洁地执行此操作。例如:
>>> x = 1
>>> xs = [1, 2, 3]
>>> [x, *xs]
[1, 1, 2, 3]
如果您更喜欢将其定义为函数,那也很容易:
def cons(x, xs):
return [x, *xs]
【讨论】:
没有。 cons 是类 Lisp 语言的实现细节;它在 Python 中没有任何意义。
【讨论】:
[1, 2, [3, 4, 5, [4, 1]]] 到[1, 2, 3, 4, 5, 4, 1] 的列表?
cons。见:stackoverflow.com/questions/406121/…