У меня есть список, как это:

l=[1,2,2,3,4,5,5,5]

Мы видим, что список содержит 5 уникальных значений с 8 общими значениями.

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

Таким образом, вывод выглядит так:

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

Как сделать это наиболее эффективным способом, используя python?

1
Kallol Samanta 1 Июл 2019 в 09:39

4 ответа

Лучший ответ

Вы можете просто перебрать свой список. Когда вы видите элемент в первый раз, добавьте его в набор, указывая, что он был замечен, и добавьте номер в список результатов. Пропустить остальных. Это сохранит индексы в том порядке, в котором элемент впервые отображается в списке:

def uniqueIndexes(l):
    seen = set()
    res = []
    for i, n in enumerate(l):
        if n not in seen:
            res.append(i)
            seen.add(n)
    return res

l=[1,2,2,3,4,5,5,5,2]

uniqueIndexes(l)

< STRONG> результаты :

[0, 1, 3, 4, 5]
0
Mark Meyer 1 Июл 2019 в 07:19

Это можно сделать:

l=[1,2,2,3,4,5,5,5] # Your list
indexes=[] # Your output list
for elem in set(l):
       indexes.append(l.index(elem))

В цикле for берется каждый элемент набора, а индекс элемента в списке извлекается с помощью метода list.index () (который возвращает индекс первого элемента требуемого типа), и значение вставляется в список индексов.

Вот как это работает. (Мне нравится объяснять, поэтому, пожалуйста, извинитесь за мое длинное письмо!)

Благодарю вас.

0
Kaustabh Chakraborty 30 Июл 2019 в 14:32

Если это не вопрос для панд, а l - просто старый список, я бы просмотрел его и сохранил упорядоченную карту от значения до первого индекса, содержащего его. Затем вы можете вернуть значения карты:

from collections import OrderedDict
def get_unique_indexes(l):
    # OrdedDict is used to preserve the order of the indexes
    result = OrderedDict()
    for i in range(0, len(l)):
        val = l[i]
        if not val in result:
            result[val] = i

    return result.values()
0
Mureinik 1 Июл 2019 в 06:53

Вы можете использовать встроенные типы для этого.

< Сильный > CODE

l=[1,2,2,3,4,5,5,5]

indexes = [l.index(x) for x in set(l)]

< Сильный > ОБЪЯСНЕНИЕ

  • set
    Все уникальные участники списка.
  • {{ X0}}
    Возвращает первый индекс элемента.

< Сильный > К.П

Как указано в комментариях, если порядок важен для вас, вы можете использовать sorted в set или в итоговом списке индексов в зависимости от предоставленных данных. Если данные уже отсортированы, я бы предложил сделать это так:

indexes = [l.index(x) for x in sorted(set(l))]
1
Sven Krüger 1 Июл 2019 в 07:10