Отметить элемент в списке - PullRequest
0 голосов
/ 21 января 2020

У меня есть упражнение о простых числах, которое требует от меня написать функцию, которая берет список элементов и число p и помечает элементы False, которые находятся в диапазоне 2p, 3p ... N

First Я создаю список True и False:

true_value = [False, False] + [True for x in range(n-1)] #Let assumme that n=16

И затем я пишу функцию, которая находит четное число в этом списке (с p = 2)

def mark_false(bool_list, p):
    range_new = [x for x in range(len(bool_list))]

    for i in range(2, len(range_new)):
        for j in range(p, len(range_new), p):
            if (i*p == range_new[j]) & (i*p <= len(range_new)):
                bool_list[j] = False
    return bool_list

Эта функция помогает мне найти местоположение четного числа (> 2) и вернуться к False

Пример: a = list_true(16)

a = [False,False,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True]

b = mark_false(a, 2)

b = [False,False,True,True,False,True,False,True,False,True,False,True,False,True,False,True]

Эта функция mark_false работает, но проблема возникает каждый раз, когда я запустить его, я должен создать список range_new, который требует много времени для расчета. Итак, как мне переписать эту функцию, чтобы она могла работать быстрее без создания новых списков?

1 Ответ

2 голосов
/ 21 января 2020

Вы, кажется, делаете вещи очень долго, ища значение j, которое соответствует кратному p, которое вы хотите установить на False. Но так как вы уже знаете это значение, искать его не нужно, просто установите его напрямую.

Я бы сделал:

def mark_false(bool_list, p):
    for i in range(p, len(bool_list), p):   # p, 2*p, 3*p, ...
        bool_list[i] = False                # do the assignment unconditionally

Возможно, вам не нужен * Оператор 1009 *, так как вы изменяете список, который вы передали на месте. Возврат списка может привести к тому, что API вводит в заблуждение, поскольку это может означать, что возвращаемый список является новым (например, измененной копией).

Если вы действительно хотите вернуть новый список, Вы можете создать его с пониманием списка, а не изменять существующий список:

def mark_false_copy(bool_list, p):
    return [x if i % p else False for i, x in enumerate(bool_list)]
...