TypeError: list indices must be integers or slices, not str python
почему вылазит ошибка (TypeError: list indices must be integers or slices, not str) суть кода в том что если в строке есть рядом стоящие два элемента 'R' и 'L' то их нужно поменять местами и вывести получившийся список, а еще нужно подсчитать количество замен, вот что я попытался сделать:
s = str(input())
lol = list(s)
c = 0
for i in lol:
if lol[i] =='R' and lol[i+1]=='L':
c+=1
lol[i],lol[i+1]=lol[i+1],lol[i]
print(lol)
на выходе ошибка TypeError: list indices must be integers or slices, not str что не так???
Ответы (1 шт):
for i in lol:
Перебирает элементы списка lol, то есть буквы введённые в переменную c.
Например, если мы введём в переменную c фразу 'Hello World'
то в списке lol будут символы из переменной c:
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
И i будет принимать значение каждого элемента списка lol.
В первой итерации for, i будет равна H, во вторую e и так далее.
Поэтому при попытке указать i как индекс, возникает TypeError.
Исправить это можно двумя способами:
s = str(input())
lol = list(s)
c = 0
for i in lol[:-1]: # Перебор всех элементов кроме последнего, иначе в конце поймаем out of range
num_elem = lol.index(i) # Определение индекса первого элемента с значение i
if lol[num_elem] == 'R' and lol[num_elem + 1] == 'L':
c+=1
lol[num_elem], lol[num_elem+1] = lol[num_elem+1], lol[num_elem]
print(lol)
Этот вариант в исполнении выше не универсален потому что метод .index() определяет индекс первого элемента со значением переданным в скобках.
То есть, если в списке будет два одинаковых элемента, индекс в обоих случаях выдаст номер первого. Это конечно можно решить если добавить дубликат c и удалять из него элементы, индексы которых мы уже узнали, но легче воспользоваться вторым вариантом:
s = str(input())
lol = list(s)
c = 0
for i in range(len(lol)-1): # Кол-во итераций равно длине lol, но меньше на 1 чтобы в конце не поймать out of range
if lol[i] == 'R' and lol[i+1] == 'L':
c += 1
lol[i],lol[i+1] = lol[i+1],lol[i]
print(lol)
В этом варианте i принимает не значения элементов, а их индексы.
Но если задача не в построении алгоритма, а в результате, то проще было бы написать так:
s = input()
c = s.count('RL') # определяем кол-во RL в строке c
lol = list(s.replace('RL', 'LR')) # создаём список из строки s в которой заменили все 'RL' на 'LR'
print(lol)