我想根据值将列表映射到数字.
例如:
['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)
是否有更优雅/更快的方式来做到这一点?
更新:奖金问题 - 按照维护的顺序执行此操作.
我正在阅读计算机程序的结构和解释(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 个额外的占用线性空间的帧。
这与其他语言中迭代器的行为不同。如果您需要沿着溪流走得更远,则会占用很多空间。当然,也可以只保留直接包围的框架,而扔掉所有其他的祖先框架。这是实际的方案实现吗?