Не знаю, как еще это сформулировать, но, скажем, у меня есть список, содержащий следующую последовательность:

[a,a,a,b,b,b,a,a,a]

И я хотел бы вернуться:

[a,b,a]

Как сделать это в принципе?

2
Luke 6 Янв 2017 в 04:40

4 ответа

Лучший ответ

Вы можете использовать itertools.groupby, это группирует последовательные одинаковые элементы в одной группе и возвращает итератор пар «ключ-значение», где ключ - это уникальный элемент, который вы ищете:

from itertools import groupby  

[k for k, _ in groupby(lst)]
# ['a', 'b', 'a']

lst = ['a','a','a','b','b','b','a','a','a']
4
Psidom 6 Янв 2017 в 01:42

Используя понимание списка:

original = ['a','a','a','b','b','b','a','a','a']
packed = [original[i] for i in range(len(original)) if i == 0 or original[i] != original[i-1]]
print(packed)  # > ['a', 'b', 'a']

Точно так же (благодаря pylang) вы можете использовать enumerate вместо range:

[ x for i,x in enumerate(original) if i == 0 or x != original[i-1] ]
1
Ivan Georgiev 6 Янв 2017 в 02:03

more_itertools имеет реализацию unique_justseen рецепт из itertools :

import more_itertools as mit

list(mit.unique_justseen(["a","a","a","b","b","b","a","a","a"]))
# ['a', 'b', 'a']
0
pylang 6 Янв 2017 в 01:49

Psidoms намного лучше, но я также могу написать это, чтобы вы могли увидеть, как это возможно, просто используя базовые циклы и операторы. Всегда полезно выяснить, какие шаги нужно предпринять для решения любой проблемы, поскольку обычно это немного упрощает кодирование простых вещей :)

original = ['a','a','a','b','b','b','a','a','a']
new = [original[0]]

for letter in original[1:]:
    if letter != new[-1]:
        new.append(letter)

В основном это добавит письмо, если предыдущая буква будет чем-то другим.

2
Peter 6 Янв 2017 в 01:48