在Python中线性化列表的最短方法

lin*_*llo 3 python algorithm dictionary list

我想从列表中使用线性增加的值创建一个列表,其中Python中的值非线性增加.例如

input =[10,10,10,6,6,4,1,1,1,10,10]
Run Code Online (Sandbox Code Playgroud)

应转变为:

output=[0,0,0,1,1,2,3,3,3,0,0]
Run Code Online (Sandbox Code Playgroud)

我的代码使用python字典

def linearize(input):
    """
    Remap a input list containing values in non linear-indices list
    i.e.
    input = [10,10,10,6,6,3,1,1]
    output= [0,0,0,1,1,2,3,3] 
    """
    remap={}
    i=0
    output=[0]*len(input)
    for x in input:
        if x not in remap.keys():
            remap[x]=i
            i=i+1
    for i in range(0,len(input)):
        output[i]=remap[input[i]]
    return output
Run Code Online (Sandbox Code Playgroud)

但我知道这段代码可以更有效率.Numpy是一个选择,有些想法可以更好地以更加pythonic的方式完成这项任务吗?必须在大列表上频繁调用此函数.

the*_*eye 5

根据你在问题中的评论,你正在寻找这样的东西

data = [8,8,6,6,3,8]
from itertools import count
from collections import defaultdict
counter = defaultdict(lambda x=count(): next(x))
print([counter[item] for item in data])
# [0, 0, 1, 1, 2, 0]
Run Code Online (Sandbox Code Playgroud)

感谢戳,

list(map(lambda i, c=defaultdict(lambda c=count(): next(c)): c[i], data))
Run Code Online (Sandbox Code Playgroud)

它现在只是一个班轮:)

  • 这很聪明,非常聪明.Python 3需要`defaultdict(count().__ next __)`btw. (2认同)