小编bla*_*nge的帖子

更优雅的方式根据值编号列表

我想根据值将列表映射到数字.

例如:

['aa', 'b', 'b', 'c', 'aa', 'b', 'a'] -> [0, 1, 1, 2, 0, 1, 3]
Run Code Online (Sandbox Code Playgroud)

我试图通过使用numpy和映射字典来实现这一点.

def number(lst):
    x = np.array(lst)
    unique_names = list(np.unique(x))
    mapping = dict(zip(unique_names, range(len(unique_names)))) # Translating dict
    map_func = np.vectorize(lambda name: d[name])
    return map_func(x)
Run Code Online (Sandbox Code Playgroud)

是否有更优雅/更快的方式来做到这一点?

更新:奖金问题 - 按照维护的顺序执行此操作.

python performance numpy

5
推荐指数
1
解决办法
139
查看次数

Scheme中流的空间复杂度

我正在阅读计算机程序的结构和解释(SICP),并希望确保我的想法是正确的。

考虑使用递归定义的以下简单流:

(define (integers-starting-from n)
    (cons-stream n (integers-starting-from (+ n 1))))

(define ints (integers-starting-from 1))

(car (cdr-stream (cdr-stream (cdr-stream (cdr-stream ints)))))
Run Code Online (Sandbox Code Playgroud)

如果我们采用 SICP 中的实现,无论何时cons-stream,我们都在有效地 consing 一个变量和一个 lambda 函数(用于延迟评估)。所以当我们cdr-stream沿着这个流时,嵌套的 lambda 函数被创建,并且一个框架链被存储用于 lambda 函数的评估。这些框架是必需的,因为 lambda 函数会计算表达式并在封闭框架中找到它们。因此,我认为为了评估流的第 n 个元素,您需要存储n 个额外的占用线性空间的帧。

这与其他语言中迭代器的行为不同。如果您需要沿着溪流走得更远,则会占用很多空间。当然,也可以只保留直接包围的框架,而扔掉所有其他的祖先框架。这是实际的方案实现吗?

lisp scheme functional-programming sicp lazy-sequences

5
推荐指数
1
解决办法
207
查看次数