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

bla*_*nge 5 python performance numpy

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

例如:

['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)

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

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

ma3*_*oun 1

Use sets to remove duplicates:

myList = ['a', 'b', 'b', 'c', 'a', 'b']
mySet = set(myList)
Run Code Online (Sandbox Code Playgroud)

Then build your dictionary using comprehension:

mappingDict = {letter:number for number,letter in enumerate(mySet)}
Run Code Online (Sandbox Code Playgroud)