Кодирование элементов в списке

#python #python-3.x #list #dictionary #indexing

#python #python-3.x #Список #словарь #индексирование

Вопрос:

Учитывая следующий список чисел:

 mylist = [1, 2, 3, 4, 4, 2, 8, 9, 10, 10, 2]
  

Цель состоит в том, чтобы получить числовое представление массива, когда все, что имеет значение, — это идентификация отдельных значений.

 indexes = [0, 1, 2, 3, 3, 1, 4, 5, 6, 6, 1] 
  

Я попытался решить это с помощью следующей функции:

 def first_occurrences(L):
    result = []
    for i in range(len(L)):
        if i not in result:
            result.append(i)
        else:
            result.append(L.index(i))
    return result
  

что дает мне неверный вывод:

 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  

Я думал об использовании словаря, но я не знаю, как это должно быть сделано

Есть идеи?

Большое спасибо

Ответ №1:

Сначала вы можете создать словарь с парами элемент-индекс:

 lookup = {k: v for v, k in enumerate(dict.fromkeys(mylist))}
# {1: 0, 2: 1, 3: 2, 4: 3, 8: 4, 9: 5, 10: 6}
  

А затем используйте этот словарь для поиска индексов:

 [lookup[i] for i in mylist]
# [0, 1, 2, 3, 3, 1, 4, 5, 6, 6, 1]
  

Комментарии:

1. Удивительные. Большое спасибо

Ответ №2:

смотрите ниже

 mylist = [1, 2, 3, 4, 4, 2, 8, 9, 10, 10, 2]
seen = dict()
for idx, x in enumerate(mylist):
    if x not in seen:
        seen[x] = idx
newList = [seen[x] for x in mylist]
print(newList)
  

вывод

 [0, 1, 2, 3, 3, 1, 6, 7, 8, 8, 1]
  

Комментарии:

1. @alex108 Давайте посмотрим на первый индекс 10 — это 8. согласны ли мы с этим? В другом ответе и в вашем вопросе это 6. Не могли бы вы объяснить, почему?