Python - как удалить дубликаты только в последовательном порядке в строке?

Для строки, такой как "12233322155552", удалив дубликаты, я могу получить "1235". Но я хочу сохранить "1232152", только удаляя последовательные дубликаты.

Благодарим вас за помощь.

Ответ 1

Microsoft/Amazon job interview тип вопроса: Это псевдокод, фактический код оставлен как упражнение.

for each char in the string do:
   if the current char is equal to the next char:
      delete next char
   else
     continue

return string

Как более высокий уровень, попробуйте (не на самом деле реализацию):

for s in string:
  if s == s+1:  ## check until the end of the string
     delete s+1

Ответ 2

Подсказка: модуль itertools является супер-полезным. Одна из функций, в частности itertools.groupby, может пригодиться здесь:

itertools.groupby(iterable [, key])

Сделайте итератор, который возвращает последовательные ключи и группы из истребитель. Ключ - это функция, вычисляющая значение ключа для каждого элемент. Если не указано или нет, по умолчанию по умолчанию используется идентификатор и возвращает элемент без изменений. Как правило, итерабельный необходимо уже сортировать по одной и той же ключевой функции.

Итак, поскольку строки являются итерабельными, вы можете сделать следующее:

use groupby to collect neighbouring elements
extract the keys from the iterator returned by groupby
join the keys together

который может быть выполнен в одной чистой строке.

Ответ 3

import re
answer = re.sub(r'(\d)\1+', r'\1', '12233322155552')

Ответ 4

Вы можете использовать itertools, вот один лайнер

>>> s = '12233322155552'
>>> ''.join(i for i, _ in itertools.groupby(s))
'1232152'

Ответ 5

Прежде всего, вы не можете удалить что-либо из строки в Python (google "неизменяемая строка Python", если это не ясно).

М первый подход:

foo = '12233322155552'
bar = ''
for chr in foo:
    if bar == '' or chr != bar[len(bar)-1]:
        bar += chr

или, используя подсказку itertools сверху:

''.join([ k[0] for k in groupby(a) ])

Ответ 6

+1 для groupby. С манжетой, что-то вроде:

from itertools import groupby
def remove_dupes(arg):
    # create generator of distinct characters, ignore grouper objects
    unique = (i[0] for i in groupby(arg))
    return ''.join(unique)

Куки для меня в Python 2.7.2

Ответ 7

number = '12233322155552'
temp_list = []


for item in number:   
   if len(temp_list) == 0:
      temp_list.append(item)

   elif len(temp_list) > 0:
      if  temp_list[-1] != item:
          temp_list.append(item)

print(''.join(temp_list))

Ответ 8

Если это вопрос интервью, то в Java решение:

public class Test2 {
public static void main(String[] args) {
    String a = "12233322155552";
    // The output : 1232152

    StringBuffer sbr = new StringBuffer();
    int i = 0 ;
    while( i < a.length() ) {

        if(sbr.length() == 0) {sbr.append(a.charAt(i));}
        if( a.charAt(i) == sbr.charAt(sbr.length() -1)) {i++ ;}

    else {
            sbr.append(a.charAt(i)); i++;
        }
    }//while
System.out.println(sbr);

}
}

IN Python:

def fix(a):
    list = []

    for element in a:
        # fill the list if the list is empty
        if len(list) == 0:list.append(element)
        # check with the last element of the list
        if list[-1] != element:  list.append(element)

    print(''.join(list))    


a= 'GGGGiiiiniiiGinnaaaaaProtijayi'
fix(a)

Ответ 9

t = '12233322155552'
for i in t:
    dup = i+i
    t = re.sub(dup, i, t)

Вы можете получить окончательный результат как 1232152