Я пытаюсь найти простое число в списке, используя фильтр, но не могу найти ошибку, так как результат - нечетные числа

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

def prime(n):
    for i in range(2,n):
        if n%i==0:return False
        else: return True
L=[x for x in range(11)];print(L)
L1=[x for x in filter(prime,L)]
print(L1)

Всего 3 ответа


Проблема в том, что у вас есть return True в цикле for.

def prime(n):
    for i in range(2, n):
        if n % i == 0:
            return False
    return True


primes = list(filter(prime, range(2, 20)))
print(primes)

Вам не нужно иметь понимание списка, чтобы отфильтровать элементы, вместо этого используйте filter(prime, range(2, 20)) .


Простое число - это число, которое не может быть разделено ни одним из предшествующих ему чисел:

def prime(n):
    for i in range(2,n):
        if n%i==0:
            return False
    return True

Используйте его в функции фильтра:

primes_less_than_hundred = filter(prime, range(3, 100))

Несколько указателей о вашем существующем коде

  • Проблема в том, что у вас есть return True внутри цикла for, которое вы хотите вытащить наружу после завершения цикла for .
  • Если мы не можем найти какой-либо делитель n, проверив n%i==0 , то только мы хотим объявить число простым числом, что происходит, когда return True происходит после того, как цикл израсходован, что означает, что мы не могли найти i, для которого n%i==0

  • Мы знаем, что 0 и 1 не являются простыми, поэтому мы можем начать наш диапазон с 2

  • Мы можем передать вашу функцию range напрямую в filter , так как это итератор, нет необходимости преобразовывать его в список и затем передавать его

  • Мы можем напрямую преобразовать результат после запуска объекта фильтра в список, приведя его к list

Как только вы это сделаете, ваш код работает как положено

def prime(n):
    for i in range(2,n):
        if n%i==0:
            return False
    #Pulled this return True outside the for loop
    return True

#Call filter on numbers from 2 to 10, and convert output to list directly
print(list(filter(prime,range(2,11))))

Выход будет

[2, 3, 5, 7]

Есть идеи?

10000