Преобразование в список-понимание - PullRequest
0 голосов
/ 30 апреля 2019

Мне дано число (n), а также массив возможных делителей для этого числа.Я должен вернуть список всех возможных простых чисел в диапазоне (n) в обратном порядке, и он должен быть записан в одну строку через понимание списка.

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

Делитель:

DOUBLE = 2
    divisors = [i for i in range(DOUBLE, math.ceil(n/DOUBLE))]
    non_primes = []
    for item in divisors:
        for item2 in divisors:
            non_primes += [item*item2]

Это код, который у меня есть:

return list(set(range(2, n)) - set(non_primes))[::-1]

Эта строка документации включена в вопрос:

    """
    Given a number and an array of possible divisors,
    return a list of all the primes in the same range in
    reverse order.
    Use list comprehension in a single line.
    :param n: a non-negative integer
    :returns: a list of prime numbers
    :Example:
    >>> primes(10)
    [7, 5, 3, 2]
    """

Ответы [ 3 ]

2 голосов
/ 30 апреля 2019

Вы можете использовать понимание списка, которое перебирает целое число от n до 2 в обратном порядке и сохраняет только те из них, которые являются либо одним из заданных делителей, либо не могут быть разделены ни одним из делителей:

[i for i in range(n, 1, -1) if i in divisors or all(i % d for d in divisors)]
0 голосов
/ 30 апреля 2019

Мое предположение было бы заключить его в единую строку.

код

def getReversedPrimes(n):
    return sorted(set(range(2, n)) - set([k*l for k in range(2, int(n/2)) for l in range(2, int(n/2))]), reverse=True)


print(getReversedPrimes(10))
print(getReversedPrimes(100))

выход

[7, 5, 3, 2]
[97, 89, 83, 79, 73, 71, 67, 61, 59, 53, 47, 43, 41, 37, 31, 29, 23, 19, 17, 13, 11, 7, 5, 3, 2]

Объяснение

  1. Не простые числа не должны быть построены из понимания списка. range возвращает объект-генератор, который можно сразу же использовать для итерации.
  2. Понимания списка также могут быть цепочками или "вложенными", как обычные циклы.
  3. Встроенная функция sorted с флагом аргумента reversed обеспечивает вывод в обратном порядке. A set не обязательно отсортировано.

Кстати, хорошее искусство использовать вычитание на наборах, чтобы убрать элементы из первого набора.

0 голосов
/ 30 апреля 2019

Это должно сделать это.

import math
n = 100
DOUBLE = 2
divisors = [i for i in range(DOUBLE, math.ceil(n/DOUBLE))]

#Get primes
print(list(set(range(2, n)) - set([ item*item2 for item in divisors for item2 in divisors]))[::-1])
#[97, 89, 83, 79, 73, 71, 67, 61, 59, 53, 47, 43, 41, 37, 31, 29, 23, 19, 17, 13, 11, 7, 5, 3, 2]

Цикл for

for item in divisors:
        for item2 in divisors:
            non_primes += [item*item2]

преобразуется в

[ item*item2 for item in divisors for item2 in divisors]

Также, как предлагается в комментарии, вы можетеупростите двойной цикл for, используя itertools.product , как показано ниже.

import math
import itertools
n = 100
DOUBLE = 2
divisors = [i for i in range(DOUBLE, math.ceil(n/DOUBLE))]

#Find all combinations of divisors
prod = itertools.product(divisors, repeat=2)

#Run through all combinations to get non primes
non_primes = [t[0]*t[1] for t in prod]

#Get primes
print([item for item in list(range(2, n)) if item not in non_primes][::-1])

Вместо того, чтобы задавать разницу, вы также можете сделать

import math
import itertools
n = 100
DOUBLE = 2
divisors = [i for i in range(DOUBLE, math.ceil(n/DOUBLE))]

#Find all combinations of divisors
prod = itertools.product(divisors, repeat=2)

#Run through all combinations to get non primes
non_primes = [t[0]*t[1] for t in prod]

#Get primes
print([item for item in list(range(2, n)) if item not in non_primes][::-1])
...