繁体   English   中英

转变为列表理解

[英]Transforming into list-comprehension

我得到了一个数字(n),以及该数字可能的除数的数组。 我应该以相反的顺序返回范围(n)的所有可能质数的列表,并且必须通过list-comprehension将其写在一行中。

我已经写了一行内容来获取必要的输出,但是我不知道如何将其写为列表理解。

除数:

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]
    """

您可以使用列表推导,以相反的顺序将整数从n迭代到2 ,并仅保留既是给定除数之一,又不能被任何除数除的整数:

[i for i in range(n, 1, -1) if i in divisors or all(i % d for d in divisors)]

这应该做。

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]

另外,如注释中所建议,您可以通过使用以下itertools.product来简化double for循环。

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])

我的建议是将其真正整合为单线。

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确保输出中是相反的顺序。 set不一定要排序。

顺便说一句,在集上使用减法从第一集中删除元素的精美艺术。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM