如何返回2的幂数列表?

时间:2012-11-13 02:11:53

标签: python

def problem(n):
myList = []
for j in range(0, n):
    number = 2 ** j
    myList.append(number)
return myList

我希望这段代码根据前2的2次幂返回2的幂。例如,如果我输入4,我希望它返回[2,4,6,8,16]。现在,如果我输入4,代码将返回[1,2,4,8]。我认为这是我的范围,这会搞乱代码。

5 个答案:

答案 0 :(得分:6)

只需使用range(1,n+1)即可。 range对某些人来说有点混乱,因为它不包括端点。因此,range(3)会返回列表[0,1,2]range(1,3)会返回[1,2]


作为旁注,表格的简单循环:

out = []
for x in ...:
   out.append(...)
通常应该用列表推导替换

out = [ 2**j for j in range(1,n+1) ]

答案 1 :(得分:2)

另一个简单而有效的解决方案(O(1)中的每一步)没有幂运算符:

def problem(n):
    return [1 << i for i in range(n)]

1&lt;&lt;我的操作是一个按位运算,转换为2 ^ i为i整数正。

https://en.wikipedia.org/wiki/Arithmetic_shift

答案 2 :(得分:1)

如果你想在O(1)中完成每一步:

def gen(x):
   i = 2
   for n in range(x + 1):
       yield i
       i <<= 1

>>> list(gen(4))
[2, 4, 8, 16, 32]

PS:问题中有拼写错误,如果您想要gen(4)的4个号码,请改用range(x)

答案 3 :(得分:0)

正如@JBernardo指出的那样,我认为你的问题中有一个拼写错误。

def squares(n):
    power = n
    square_list = []
    for i in range(1,n+1):
        square_list.append(2 ** i)
    return square_list


print squares(4)

将返回

[2,4,8,16]

答案 4 :(得分:0)

import math
n = input()
a = [i for i in xrange(1, n+1) if (math.log(i)/math.log(2)).is_integer()]
print a
>>> [2, 4, 8, 16 ...]

说明:
如果数字的对数除以2的对数是一个整数,那么它只能是2的幂。

例如log(32)= log(2 ^ 5)= 5 * log(2)
5 * log(2)除以log(2)得出5,它是整数。

列表中还将有floor(math.log(n,2))个元素,因为如果n本身不是2的幂,那就是n以下2的幂数的公式。