У меня есть задача получить строку 'AAAABBBCCDAABBB'
в список, подобный этому: ['A','B','C','D','A','B']
Я работаю над этим уже 2 часа, и я не могу получить решение. Это мой код:
list = []
string = 'AAAABBBCCDAABBB'
i = 1
for i in string:
list.append(i)
print(list)
for element in list:
if list[element] == list[element-1]:
list.remove(list[element])
print(list)
Я новичок в программировании, и ошибка “Индексы TypeError: list должны быть целыми или фрагментами, а не str” всегда отображается…
Я уже изменил сравнение
if list[element] == list[element-1]
к
if list[element] is list[element-1]
Но ошибка остается прежней. Я уже несколько раз искал googled, но всегда были списки, которым не нужен строковый формат, но мне он нужен (я прав?).
Спасибо, что помогли!
NoAbL
Прежде всего, не называйте свои переменные после встроенных операторов python или структур данных, таких как list
, tuple
или даже имя импортируемого модуля, это также относится к файлам. например, назвав ваш файл socket.py
и импортируя модуль socket
, определенно приведет к ошибке (я оставлю вас попробовать это самостоятельно)
в вашем коде element
есть строка, индексы итерации должны быть номерами не строк, поэтому вы можете указать python
дайте мне элемент в позиции 2.
но прямо сейчас вы пытаетесь сказать мне пункт в позиции A
, и это даже не актуально на английском языке, без разговора о языке программирования.
вам следует использовать функцию enumerate
, если вы хотите получить индексы итерации по мере ее прохождения через нее или вы могли бы просто сделать
for i in range(len(list))
и проведите цикл по диапазону длины списка, вам все равно не нужны элементы.
Вот более простой подход к тому, что вы хотите сделать
s = string = 'AAAABBBCCDAABBB'
ls = []
for i in s:
if ls:
if i != ls[-1]:
ls.append(i)
else:
ls.append(i)
print(ls)
Это другой подход, но ваша проблема может быть решена с помощью itertools.groupby
следующим образом:
from itertools import groupby
string = 'AAAABBBCCDAABBB'
answer = [group[0] for group in groupby(string)]
print(answer)
Выход
['A', 'B', 'C', 'D', 'A', 'B']
В соответствии с документацией groupby
:
Сделайте итератор, который возвращает последовательные клавиши и группы из итеративного
В моем примере мы используем понимание списка для итерации по последовательным клавишам и группам и используем индекс 0
для извлечения только ключа.
Вы можете попробовать следующий код:
list = []
string = 'AAAABBBCCDAABBB'
# remove the duplicate character before append to list
prev = ''
for char in string:
if char == prev:
pass
else:
list.append(char)
prev = char
print(list)
Выход:
['A', 'B', 'C', 'D', 'A', 'B']
В вашем цикле element
есть строка. Вы хотите иметь индекс.
Попробуйте for i, element in enumerate(list)
.
EDIT: i
теперь будет индексом element
, который вы в настоящее время выполняете.