Найти индексы уникальных элементов списка в python?

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

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

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

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

Итак, вывод выглядит так:

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

Как сделать это наиболее эффективным способом с помощью python?

если это серия панд, просто сделайте pd.Series(l).drop_duplicates().index иначе, если это список, вам не нужны панды,

anky 01.07.2019 08:42
l.index[~l.duplicated()] это l это серия
cs95 01.07.2019 08:44

Это конкретно вопрос панд? Он помечен pandas, но в вопросе нет ничего специфичного для панд.

Mark 01.07.2019 08:44

Где ваш подход к решению этой проблемы? Какова ваша конкретная проблема с вашим кодом? Где твой минимальный воспроизводимый пример? Что вы пробовали?

Patrick Artner 01.07.2019 08:49

Пожалуйста, опубликуйте код, который вы пытались решить свою проблему. В своем нынешнем состоянии ваш вопрос не требует никаких усилий.

J...S 01.07.2019 08:58
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
5
9 837
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Если это не вопрос, специфичный для панд, а 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()

Я бы использовал for i, val in enumerate(l): скорее диапазон с len.

Dan D. 01.07.2019 09:12

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

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]
Ответ принят как подходящий

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

КОД

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))]

index() вернет позицию первого появления

Osman Mamun 01.07.2019 09:02

Верно, @mamun, но будет ли set(l) повторять пункты по порядку?

Mark 01.07.2019 09:04

Да, это правда. Ему нужно выполнить sort() позже, чтобы получить правильный порядок индексов, или должен быть лучший способ.

Osman Mamun 01.07.2019 09:06

@MarkMeyer Это не было указано в OP, но мы можем использовать sorted, чтобы индексы были в порядке ... @mamun "s.index(x) = индекс первого вхождения x в s" - из здесь

Sven Krüger 01.07.2019 09:07

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

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() (который возвращает индекс первого элемента нужного типа) и вставляется значение в список индексов.

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

Спасибо.

почему здесь никто не упомянул np.unique??

import numpy as np
np.unique([1,6,6,2,2,3,4,5,5,5], return_index=True)

>>> (array([1, 2, 3, 4, 5, 6]), array([0, 3, 5, 6, 7, 1], dtype=int64))

первый массив содержит уникальные значения (отсортированный), а второй массив (возвращается, если для return_index установлено значение True) представляет собой список индексов первых вхождений

Другие вопросы по теме