Вот краткое решение с промежуточным словарем:
x = ['hello', 'John', 'hi', 'John', 'hello', 'pumpum']
d = dict(zip(set(x),range(len(set(x)))))
y = [d[i] for i in x]
print(y) # [2, 1, 0, 1, 2, 3]
Примечание: это работает, если вам не нужно упорядочивать числовые метки, т. Е. Если вам не нужно связывать 0 с первым элементом в x
, 1 со вторым элементом в x
и т. Д. ...
РЕДАКТИРОВАТЬ после комментария от Патрика Артнера :
Он предлагает предварительно вычислить набор и сохранить его как собственную переменную для оптимизации, и он прав. Вот обновленный код:
x = ['hello', 'John', 'hi', 'John', 'hello', 'pumpum']
s = set(x)
d = dict(zip(s,range(len(s))))
y = [d[i] for i in x]
print(y) # [2, 1, 0, 1, 2, 3]