Вот список a=[1,1,1,2,4,2,4,32,1,4,35,23,24,23]

Я делаю это в Python:

unique_number=list(set(a))
ans=map(lambda x:a.index(x),unique_number)

Выход:

<map at 0x2b98b307828>

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

0
Garvey 29 Авг 2017 в 11:26

3 ответа

Лучший ответ

Вы можете избежать повторной индексации и сначала создавать набор - просто создайте dict итерацию по a в обратном направлении, так как словарь сохранит только последнее значение для ключа (в данном случае - самый ранний из появляющихся индексов). ), например:

a=[1,1,1,2,4,2,4,32,1,4,35,23,24,23]

first_index = {v:len(a) - k for k,v in enumerate(reversed(a), 1)}
# {1: 0, 2: 3, 4: 4, 23: 11, 24: 12, 32: 7, 35: 10}

Таким образом, вы сканируете последовательность только один раз.

1
Jon Clements 29 Авг 2017 в 08:38

Этот код будет работать так, как вы ожидали в Python 2. В Python 3 {{X0 }} возвращает итератор. Вы можете, например, преобразовать его в список:

>>> ans=map(lambda x:a.index(x),unique_number)
>>> list(ans)
[7, 0, 3, 10, 4, 11, 12]
2
Mureinik 29 Авг 2017 в 08:30

Попробуй это:

for value in map(lambda x:a.index(x),unique_number):
     print(value)

Или добавить это:

for var in ans:
     print(var)
1
matsbauer 29 Авг 2017 в 08:29