Индексы слов, которые появляются в списке только один раз

У меня есть следующий список слов:

x = ['Gaga', 'Gaga', 'Lam', 'Reem', 'Pal', 'Gaga','Lam']

Мне нужно удалить слова, которые появляются только один раз, и вернуть туда индексы или позиции.

y = ['Gaga', 'Gaga', 'Lam', 'Gaga', 'Lam']

loc = [0, 0, 0, 1, 1, 0, 0]

Любая простая функция для этого?

Вы что-нибудь пробовали?

kabanus 07.07.2018 10: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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
79
5

Ответы 5

Вы можете использовать collections.Counter и изолировать элементы, появляющиеся только один раз. затем используйте списки для желаемых результатов. Общее решение - O (n), хотя оно включает в себя 3 прохода.

x = ['Gaga', 'Gaga', 'Lam', 'Reem', 'Pal', 'Gaga','Lam']

from collections import Counter

singles = {k for k, v in Counter(x).items() if v == 1}

y = [i for i in x if i not in singles]
loc = [int(i in singles) for i in x]

print(y, loc, sep='\n')

['Gaga', 'Gaga', 'Lam', 'Gaga', 'Lam']
[0, 0, 0, 1, 1, 0, 0]

Вы можете использовать класс Counter именно для этой цели:

from collections import Counter

x = ['Gaga', 'Gaga', 'Lam', 'Reem', 'Pal', 'Gaga','Lam']

c = Counter(x)

new_values = [item for item in x if c[item] > 1]
indexes = [1 if c[item] == 1 else 0 for item in x]

print(new_values)
print(indexes)

Выход:

['Gaga', 'Gaga', 'Lam', 'Gaga', 'Lam']
[0, 0, 0, 1, 1, 0, 0]

Отметим, что O (n) тоже. Но не большой поклонник тройного против int(c['item'] == 1). Кроме того, он менее эффективен, чем мой, поскольку вы тестируете c[item] == 1 в обоих списках.

jpp 07.07.2018 11:29

Альтернативный вариант один лайнер с модулем pandas и его функцией pd.Series.duplicated():

In [80]: x = ['Gaga', 'Gaga', 'Lam', 'Reem', 'Pal', 'Gaga','Lam']

In [81]: (~pd.Series(x).duplicated(keep=False)).astype(int).tolist()
Out[81]: [0, 0, 0, 1, 1, 0, 0]

Чтобы удалить все недубликаты:

In [85]: s = pd.Series(x)

In [86]: s[s.duplicated(keep=False)].tolist()
Out[86]: ['Gaga', 'Gaga', 'Lam', 'Gaga', 'Lam']

Второстепенный момент, даже лучше было бы вычислить s.duplicated(keep=False) в качестве начального шага и использовать его в обоих своих расчетах. Но все же +1 за хорошее решение Panda.

jpp 07.07.2018 11:38

@jpp, конечно, при объединении этих двух в один общий блок, s = pd.Series(x) и dups = s.duplicated(keep=False) должны быть рассчитаны заранее. Я разделил их для демонстрации однострочников pandas

RomanPerekhrest 07.07.2018 11:52

Не могли бы вы создать новый список и поработать с ним?

x = ['Gaga', 'Gaga', 'Lam', 'Reem', 'Pal', 'Gaga','Lam']
loc = []
new_x = []

for name in x:
    if x.count(name) == 1:
        loc.append(1)
    else:
        loc.append(0)
        new_x.append(name)

Вы также можете использовать понимание списка

x = ['Gaga', 'Gaga', 'Lam', 'Reem', 'Pal', 'Gaga', 'Lam'] 
y = [name for name in x if x.count(name) != 1]

выход

[«Гага», «Гага», «Лам», «Гага», «Лам»]

это решение имеет квадратичную сложность по количеству элементов списка, что не является лучшим

Grisha 11.07.2018 14:33

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