Python3 TypeError: индексы списка должны быть целыми числами или срезами, а не str

Вопрос:

У меня есть задача получить строку '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)

Ответ №1

Это другой подход, но ваша проблема может быть решена с помощью 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 для извлечения только ключа.

Ответ №2

Вы можете попробовать следующий код:

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']

Ответ №3

В вашем цикле element есть строка. Вы хотите иметь индекс.

Попробуйте for i, element in enumerate(list).

EDIT: i теперь будет индексом element, который вы в настоящее время выполняете.

Оцените статью
TechArks.Ru
Добавить комментарий