【发布时间】:2022-01-31 18:54:08
【问题描述】:
我想总体上实现以下目标,理想情况下不使用 for 循环来单步执行每个元素,因为这似乎效率低下。列表的每个元素都将是 int 类型。
3 个例子:
In [1]: L1 = [3,6,19,6,3,3,19]
In [2]: f(L1)
Out [2]: [0,1,2,1,0,0,2]
In [3]: L2 = [0,1,2,4,1,4,1,0]
In [4]: f(L2)
Out [4]: [0,1,2,3,1,3,1,0]
In [5]: L3 = [2,3,3,4,2,2,3,4]
In [6]: f(L3)
Out [6]: [0,1,1,2,0,0,1,2]
数字的顺序无关紧要,但相对频率很重要。
如果数字之间没有空格,我当前的尝试就可以工作 - 就像在 L3 中一样。
我的尝试:
def f(L):
L = np.array(L) - min(L)
return list(L)
但这显然不能按照我想要的方式处理差异。如果我可以避免 L 的每个元素的 for 循环,并且还避免进行元素比较(例如检查 L1 中 19 之后的下一个最小数字是否为 6),那将是理想的,但对我来说并不明显有一种方法可以避免这种情况。
【问题讨论】:
-
您的输出似乎将每个数字替换为第一次出现的数字的索引?
-
我认为意图是根据其在原始数据中的排名来替换数字。每次出现时,最小值变为 0,下一个最小值变为 1,依此类推。
-
@KarlKnechtel 完全正确。这就是我想要做的。我现在正在实施第一个建议,如果它符合我的要求,我会将其标记为已接受的答案。否则,我将编辑我的问题以提供更多/更好的上下文。