Получение уникальных элементов (элементов, которые не повторяются рядом друг с другом) из последовательности

#python #list #function #for-loop #indexing

#python #Список #функция #for-цикл #индексирование

Вопрос:

Я пытаюсь написать функцию func(), которая возвращает только уникальные элементы из заданного ввода в том же порядке.

например, ‘AAAABBBCCDAABBB’ вернет [‘A’, ‘B’, ‘C’, ‘D’, ‘A’, ‘B’]

Просто новичок, поэтому было бы здорово, если бы я мог получить некоторую помощь. Прилагаемый мой код ниже — извинения, если это не лучшая практика с точки зрения удобочитаемости.

 enter code here 
def unique_in_order(string):

new_list =[]


#using a for loop access the elements 
for n in range(len(string)):
    
    print(string[n],string[n 1])
    
    if string[n] != string[n 1]:
        new_list.append(string[n])
        
return new_list
 

Результат, который я получаю
введите описание изображения здесь

Ответ №1:

При проверке последнего элемента строки вы получаете доступ к элементу n 1, который находится за пределами строки. Исправленный код выглядит следующим образом:

 def unique_in_order(string):
    if len(string) == 0:
        return [];
    new_list = [string[0]]
    #using a for loop access the elements 
    for n in range(1, len(string)):        
        print(string[n-1],string[n])
        if string[n] != string[n-1]:
            new_list.append(string[n])
    return new_list
 

Ответ №2:

В python вы можете использовать метод groupby для этого

 from itertools import groupby

my_str = "AAAABBBCCDAABBB"
res = list(map(lambda x: x[0], groupby(my_str)))

print(res) # ['A', 'B', 'C', 'D', 'A', 'B']
 

Ответ №3:

Вы столкнулись с ошибкой индекса в последнем цикле. Поскольку вы проверяете string[n 1] в последнем цикле, когда выполняете n 1, он будет вне индекса.

Комментарии:

1. Да, я понял ошибку, но просто не пытался выполнить n-1! Еще раз спасибо

Ответ №4:

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

 def unique_in_order(string):
    new_list = []
    for i in range(len(string)):
        # if the new letter isn't same as previous then add to list
        if string[i] != string[i - 1]: 
             new_list.append(string[i])
        else:
             pass
    return new_list `
 

Ответ №5:

Регулярное выражение?

 >>> re.findall(r'(.)1*', 'AAAABBBCCDAABBB')
['A', 'B', 'C', 'D', 'A', 'B']