2016-10-31 2 views
0

Я учусь, как манипулировать списками в Python, так что я решил составить упражнение, чтобы увидеть, если я мог бы сделать реализацию игры «FizzBuzz» только с помощью списка операций Python, как показано ниже:Python - Преобразование int в строку работает только один раз?

#Fizzbuzz Implementation 

def fizzbuzz(L): 
    # L is a list of integers in order 
    for i in L[2::3]: 
     L[i-1] = str(L[i-1]) 
     L[i-1] = L[i-1].replace(L[i-1],'') 
     #No exception thrown here 

    for i in L[4::5]: 
     L[i-1] = str(L[i-1]) #Exception on this line 
     L[i-1] = L[i-1].replace(L[i-1],'') 

    for i in L[2::3]: 
     L[i-1] += 'fizz' 

    for i in L[4::5]: 
     L[i-1] += 'buzz' 

    return L[:] 

L = list(range(1,101)) 
L[:] = fizzbuzz(L) 

Я пытался преобразовать целые числа в списке интересов в пустые строки, а затем добавить строки в них, тем не менее я получаю TypeError: неподдерживаемый тип операнда (ов) для -: «ул» и «INT»

I заметил, что первый цикл происходит без проблем, но исключение всегда выбрасывается во второй цикл. Это происходит, даже если я переключаю порядок петель.

Может кто-нибудь объяснить, за что выбрасывается исключение, и почему это происходит только во втором цикле?

+0

Почему вы добавляете элемент в строку и заменяете все это на пустую строку вместо просто 'L [i-1] = '''? – TigerhawkT3

+0

Каждый элемент является целым числом, поэтому я решил, что мне пришлось сначала набросить на строку. Я не знаю, правильно ли это делать. – AAC

ответ

1

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

def fizzbuzz(L): 
    for i,val in enumerate(L[2::3], start=1): 
     L[i*3-1] = '' 
    for i,val in enumerate(L[4::5], start=1): 
     L[i*5-1] = '' 
    for i,v in enumerate(L[2::3], start=1): 
     L[i*3-1] += 'fizz' 
    for i,v in enumerate(L[4::5], start=1): 
     L[i*5-1] += 'buzz' 

L = list(range(1,101)) 
fizzbuzz(L) 
+0

Мне очень хотелось бы услышать, что не так с этим ответом, чтобы он заслужил нисходящего потока, чтобы я мог его улучшить. – TigerhawkT3

-1

unsupported operand type(s) for -: 'str' and 'int'

Интерпретатор Python говорит, что вы пытаетесь вычесть строку и целое число. Например: «123» - 1 В первом цикле вы преобразовали целые числа в строки, поэтому, если вы хотите сделать вычитание во втором цикле, вам нужно преобразовать строки обратно в целые числа. Как: INT («123») - 1

L[i-1] = str(L[int(i)-1]) 
+0

Эти элементы полностью заменены пустыми строками. – TigerhawkT3

+0

Не имеет значения, какое значение имеет строка, Python не позволит вычесть строку и int. Попробуйте «-1», и вы увидите то же сообщение об ошибке «неподдерживаемый операнд». – Waxrat

+0

На самом деле, прочитайте мой комментарий. Вызов 'int()' в пустой строке не приведет к магическому возврату целого числа, которое использовалось для того, чтобы занять этот элемент списка. – TigerhawkT3

Смежные вопросы