我想改写自己的" Prime数字"从R到Python的功能。在R中它看起来像这样:
prime_numbers <- function(x)
{
p <- 2
result <- NULL
while (p <= x)
{
if (x<3) lp <- c(2) else if (x<5) lp <- c(2,3) else if (x<7) l<- c(2,3,5) else lp <- c(2,3,5,7)
if (p%%2!=0 && p%%3!=0 && p%%5!=0 && p%%7!=0) result <- c(result,p)
p <- p+1
}
return(c(lp,result))
}
它正常工作。我只需要设置一个数字作为参数,它会打印小于这个数字的所有素数。
我在Python中编写了这个函数。
def prime_numbers (x):
p = 2
result = None
while p <= x:
if x<3:
lp = 2
elif x<5:
lp = [2,3]
elif x<7:
lp = [2,3,5]
else:
lp = [2,3,5,7]
if p%2!=0 and p%3!=0 and p%5!=0 and p%7!=0:
result = [result,p]
p = p+1
return [lp,result]
结果接近正确,但是当我使用50作为参数时,我在控制台中收到类似的内容。
[[2,3,5,7],[[[[[[[[[[[None,11],13],17],19],23],29],31],37] ,41],43],47]]
没有打印,列表以奇怪的方式组成。在我看来,Python中的列表并不像R中的向量那样简单灵活。
如何使用尽可能多的类似语法在Python中获得与R相同的效果?
答案 0 :(得分:3)
这应该这样做:
def prime_numbers(x):
p = 2
result = [] # instead of "result = None"
while p <= x:
if x<3:
lp = 2
elif x<5:
lp = [2,3]
elif x<7:
lp = [2,3,5]
else:
lp = [2,3,5,7]
if p%2!=0 and p%3!=0 and p%5!=0 and p%7!=0:
result.append(p) # instead of "result = [result, p]"
p = p+1
return lp + result # instead of "[lp, result]"
>>> prime_numbers(50)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
与Professor_joykill提到的一样,您应该将结果实例化为空列表,而不是值为None。
然后使用append(p)将素数添加到素数列表中> 7.
最后,您使用“+”连接列表,而不是将两个列表合并到另一个列表中。
希望这有帮助,
科恩