Найти индексы уникальных элементов списка в python? - PullRequest
0 голосов
/ 01 июля 2019

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

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

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

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 01 июля 2019

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

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)

Результаты:

[0, 1, 3, 4, 5]
0 голосов
/ 01 июля 2019

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

КОД

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

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

ОБЪЯСНЕНИЕ

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

КОММЕНТАРИЙ

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

indexes = [l.index(x) for x in sorted(set(l))]
0 голосов
/ 01 июля 2019

Если это не вопрос панды, а 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...