2016-09-13 6 views
1

Так что это просто упражнение, которое я делаю для удовольствия на codewars.com. Дело в том, чтобы взять строку и разделить ее, взяв последний символ и добавив его в строку, взяв первый символ и добавив его в другую строку, пока у вас не будет 1 (для строки с нечетным числом букв) или 0 (для строки с четным числом букв). Вот вам ссылка на challenge, если вам интересно.Pop from empty list error ТОЛЬКО на списках с четным количеством элементов

def pop_shift(test): 
    firstSol = [] 
    secondSol = [] 
    testList = list(test) 
    while len(testList) != 1: 
     firstSol.append(testList.pop()) 
     secondSol.append(testList.pop(0)) 
    return [''.join(firstSol), ''.join(secondSol), ''.join(testList)] 

Мой код дает мне правильный результат, если строка имеет нечетное количество символов:

['erehtse', 'example', 't'] 

Но с четным количеством символов я получаю эту ошибку:

Traceback (most recent call last): 
    File "<pyshell#37>", line 1, in <module> 
    pop_shift("egrets") 
    File "<pyshell#35>", line 6, in pop_shift 
    firstSol.append(testList.pop()) 
IndexError: pop from empty list 

Я просмотрел кучу вопросов, связанных с методом pop(), но ничего не звучало очень похоже на это. Я также тестировал это с помощью множества строк и изучал документацию по методу pop. Должно быть что-то, что мне не хватает. Любые указатели оцениваются. Это также мой первый вопрос, поэтому, если есть что-то еще, что вы хотели бы видеть, сообщите мне.

+0

Это была бы хорошая возможность научиться использовать отладчик. – JETM

ответ

0

Вместо while len(testList) != 1, вам нужно: while len(testList) > 1, так как len(testList) будет прыгать от 2 к 0 на «даже» строки:

def pop_shift(test): 
    firstSol = [] 
    secondSol = [] 
    testList = list(test) 
    while len(testList) > 1: 
     firstSol.append(testList.pop()) 
     secondSol.append(testList.pop(0)) 

    return [''.join(firstSol), ''.join(secondSol), ''.join(testList)] 

Тогда:

print(pop_shift("Monkeys")) 
> ['sye', 'Mon', 'k'] 

print(pop_shift("Monkey")) 
> ['yek', 'Mon', ''] 
+0

Большое спасибо! Я знал, что мне не хватает логики, но я просто не мог этого видеть. Очень признателен! – erenk

+0

@erenk Добро пожаловать! Как один символ может изменить поведение ... –

0

Ваша петля проверяет, не превышает ли длина списка 1; для списка даже длины, так как вы всегда поп 2 пунктов, в то время, он никогда не будет видеть длину 1.