Замените целые числа в списке строкой Python - PullRequest
0 голосов
/ 17 сентября 2018

Я работаю над назначением кодирования в Python и пытаюсь понять, почему мой код не работает.

Написать в Python функцию с именем BooHoo, которая принимает целое число, n и сохраняетвсе целые числа от 1 до n в списке.Однако, если целое число в списке делится на 3, список должен вместо этого содержать «Boo».Если целое число делится на 5, список должен содержать «Hoo».Если целое число делится на 3 и 5, вместо этого список должен содержать «BooHoo».

def BooHoo(n):
'''
A function which returns a list of integers, and replaces integers divisible by 3 with "Boo" and integers
divisible by 5 with "Hoo" and integers divisible by 3 and 5 with "BooHoo"


Parameters
-------
n: an integer


Returns
--------

final_list: a Python list

'''

main_list = []
for x in range(n):
    main_list.append(x)


for idx, j in enumerate(main_list):
    if not (idx % 3) and not (idx % 5):
        main_list.pop(idx)
        main_list.insert(idx, 'BooHoo')
    elif not (idx % 3):
            main_list.pop(idx)
            main_list.insert(idx, 'Boo')
    elif not (idx % 5):
            main_list.pop(idx)
            main_list.insert(idx, 'Hoo')
    else:
        continue

final_list = [main_list]

return final_list

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Лучший способ решить вашу проблему - создать правильный список с самого начала (с использованием цикла или списка), чем модифицировать последовательный список чисел.

def BooHoo(n):
    return ['BooHoo' if not (i % 5 or i % 3) else 
               'Hoo' if not i % 5 else 
               'Boo' if not i % 3 else 
                   i for i in range(1,n+1)]

И еще дляради удовольствия, чем полезность, решение на основе словаря:

def BooHoo(n):
    words = {(1,1): 'BooHoo', (1,0): 'Boo', (0,1): 'Hoo'}
    return [words.get((i % 3 == 0, i % 5 == 0), i) for i in range(1, n+1)]
0 голосов
/ 17 сентября 2018

Зачем проходить все эти проблемы с добавлением и выталкиванием столько, что не нужно

def BooHoo(n):

    for index, item in enumerate(list(range(1, (n+1))):
        if not item % 5 and not item % 3:
            lista[index] = "BooHoo"
        elif not item % 3:
            lista[index] = "Boo"
        elif not item % 5:
            lista[index] = "Hoo"
        else:
            pass

    return lista 

print(BooHoo(25))

Вывод

(xenial)vash@localhost:~/python/stack_overflow$ python3.7 boohoo.py
[1, 2, 'Boo', 4, 'Hoo', 'Boo', 7, 8, 'Boo', 'Hoo', 11, 'Boo', 13, 14, 'BooHoo', 16, 17, 'Boo', 19, 'Hoo', 'Boo', 22, 23, 'Boo', 'Hoo']
0 голосов
/ 17 сентября 2018

Произошли некоторые логические ошибки в отношении индекса и фактических элементов списка.Я выделил измененные / добавленные строки комментарием #.В основном вам нужно было заменить idx на j, потому что idx был индексом, а j был фактическим элементом.Если вы начнете с range(n), это не имеет значения, потому что индекс совпадает с j.Но поскольку вы упомянули в своем вопросе, что вы хотите хранить числа от 1 до n, вам нужно использовать range(1, n+1)

def BooHoo(n):
    main_list = []
    for x in range(1,n+1): # replaced range(n) to start from 1
        main_list.append(x)

    for idx, j in enumerate(main_list):
        if not (j % 3) and not (j % 5): # replaced idx by j
            main_list.pop(idx)
            main_list.insert(idx, 'BooHoo')
        elif not (j % 3): # replaced idx by j
                main_list.pop(idx)
                main_list.insert(idx, 'Boo')
        elif not (j % 5): # replaced idx by j
                main_list.pop(idx)
                main_list.insert(idx, 'Hoo')
        else:
            continue

    return main_list # Removed unnecessary second list

# Call the function
print (BooHoo(15))

Выход

[1, 2, 'Boo', 4, 'Hoo', 'Boo', 7, 8, 'Boo', 'Hoo', 11, 'Boo', 13, 14, 'BooHoo']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...