Как сохранить уникальные предметы из коллекции похожих предметов в списке? - PullRequest
0 голосов
/ 01 октября 2019

У меня есть список, подобный следующему

a = [5,5,5,5,3,3,2,2,2,2,5,5,5,2,2,2,2,2]

Я хочу получить следующий список вывода

b = [5,3,2,5,2]

Обратите внимание, что я пытался использовать

list(OrderedDict.fromkeys(a))

который дает мне

[5, 3, 2]

Обратите внимание, что он не учитывает 2-й 5 или 2-й 2, поскольку они к тому времени не являются уникальными.

Мне нужен способ, чтобы машина понялачто, когда он встречает уникальный элемент (скажем, первый «5»), он должен хранить его в списке b. Следовательно, когда он встречает первое «3» или первое «2», он должен также сохранить их в списке b. Нет проблем до этого момента. Когда он встречает второй набор '5', он должен сохранить это 5 как новый элемент в списке b. То же самое касается второго набора 2-х.

Есть ли Pythonic способ сделать это?

Ответы [ 3 ]

3 голосов
/ 01 октября 2019

Кроме выполнения цикла for, вы можете использовать itertools groupby:

import itertools

a = [5,5,5,5,3,3,2,2,2,2,5,5,5,2,2,2,2,2]
b = [x[0] for x in itertools.groupby(a)]  # [5, 3, 2, 5, 2]

Документацию по этому вопросу можно найти здесь: https://docs.python.org/3/library/itertools.html#itertools.groupby

0 голосов
/ 01 октября 2019

Bro, вы решаете эту проблему без итератора, используя полный список

a = [5,5,5,5,3,3,2,2,2,2,5,5,5,2,2,2,2,2]
b = [a[i] for i in range(len(a)) if a[i]! = a[i-1]]
Print(b)
Output is b = [5,3,2,5,2]
0 голосов
/ 01 октября 2019

если вы работаете с массивами numpy, вы можете использовать простой фильтр diff для маскировки повторяющихся элементов:

import numpy as np

a = np.array([5,5,5,5,3,3,2,2,2,2,5,5,5,2,2,2,2,2])

mask = np.ones(a.shape).astype(np.bool_)
mask[1:] = np.diff(a).astype(np.bool_) # prepend a 'True', adjust if not 1D

b = a[mask]
# [5 3 2 5 2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...