У меня есть такой список:
l=[1,2,2,3,4,5,5,5]
Мы видим, что список list содержит 5 уникальных значений с 8 общими значениями.
Мне нужны индексы уникальных значений из списка в формате списка.
Итак, вывод выглядит так:
indexes=[0,1,3,4,5]
Как сделать это наиболее эффективным способом с помощью python?
l.index[~l.duplicated()] это l это серия
Это конкретно вопрос панд? Он помечен pandas, но в вопросе нет ничего специфичного для панд.
Где ваш подход к решению этой проблемы? Какова ваша конкретная проблема с вашим кодом? Где твой минимальный воспроизводимый пример? Что вы пробовали?
Пожалуйста, опубликуйте код, который вы пытались решить свою проблему. В своем нынешнем состоянии ваш вопрос не требует никаких усилий.






Если это не вопрос, специфичный для панд, а 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.
Вы можете просто перебрать свой список. В первый раз, когда вы видите элемент, добавьте его в набор, указав, что он был замечен, и добавьте номер в список результатов. Пропустите остальные. Это сохранит индексы в том порядке, в котором элемент впервые появляется в списке:
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)]
ОБЪЯСНЕНИЕ
КОММЕНТАРИЙ
Как указано в комментариях, если для вас важен порядок, вы можете использовать sorted в set или в результирующем списке индексов в зависимости от предоставленных данных. Если данные уже отсортированы, я бы предложил сделать это так:
indexes = [l.index(x) for x in sorted(set(l))]
index() вернет позицию первого появления
Верно, @mamun, но будет ли set(l) повторять пункты по порядку?
Да, это правда. Ему нужно выполнить sort() позже, чтобы получить правильный порядок индексов, или должен быть лучший способ.
@MarkMeyer Это не было указано в OP, но мы можем использовать sorted, чтобы индексы были в порядке ... @mamun "s.index(x) = индекс первого вхождения x в s" - из здесь
Это можно сделать:
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) представляет собой список индексов первых вхождений
если это серия панд, просто сделайте
pd.Series(l).drop_duplicates().indexиначе, если это список, вам не нужны панды,