如何在列表中找到小于n的2的最高幂?

时间:2019-04-04 19:25:28

标签: python python-3.x

我有一个喜欢的列表

lst = [20,40,110]

我想在满足以下条件的列表中找到2的最高幂

  

对于第一个数字,最高幂2将获得列表的第一个元素作为输入。结果是16(最接近20)

     

对于下一个数字,它将获得先前结果(即16)和当前数字(即40)的总和,因此最接近的数字将是32(最接近的40 +16)

所以我期望的输出是

lst_pow2 = [16、32、128]

这是我当前的代码,用于查找数字中的最大数字,但是对于我的问题,它应该更改某些内容,因为我的输入是列表。有什么建议吗?谢谢

# Python3 program to find highest  
# power of 2 smaller than or  
# equal to n. 
import math 

def highestPowerof2(n): 

    p = int(math.log(n, 2)); 
    return int(pow(2, p));  

所以我尝试了但没有做加法运算

lst_power2 = [highestPowerof2(lst[i]) for i in range(len(lst))]

5 个答案:

答案 0 :(得分:2)

您也许可以使用以下内容:

lst_power2 = [highestPowerof2(lst[i]+((i>0) and highestPowerof2(lst[i-1]))) for i in range(len(lst))]

代替

lst_power2 = [highestPowerof2(lst[i]) for i in range(len(lst))]

答案 1 :(得分:2)

您可能想要这样修改您的方法:

  1. 将函数修改为2个整数。 prev_powercurr_num(在您的代码中为n
  2. 计算第一个数字的2的幂并添加到结果列表中
  3. 现在将此数字和列表中的下一个数字传递给您的highestPowerof2函数

答案 2 :(得分:1)

使用一个额外的变量来跟踪要添加的值,并在迭代时构建逻辑。

lst = [20, 40, 110]

import math 

def highestPowerof2(n): 
    p = int(math.log(n, 2)) #you do not need semi colons in python
    return int(pow(2, p))

acc = 0 #to keep track of what was the last highest* power
result = []
for n in lst:
    result.append(highestPowerof2(n + acc))
    acc = result[-1]

print(result)
#Output:
[16, 32, 128]

答案 3 :(得分:1)

您也可以使用reduce()

functools.reduce(lambda res,n:res+[highestPowerof2(n+res[-1])],lst,[0])[1:]

这很短,只是[1:]的结尾很丑
或为:

functools.reduce(lambda res,n:res+[highestPowerof2(n+(len(res) and res[-1]))],lst,[])

它不需要切片,但是里面的可读性较差。


完整示例:

import math,functools

def highestPowerof2(n):
    p = int(math.log(n, 2))
    return int(pow(2, p))

lst = [20, 40, 110]
print(functools.reduce(lambda res,n:res+[highestPowerof2(n+res[-1])],lst,[0])[1:])
print(functools.reduce(lambda res,n:res+[highestPowerof2(n+(len(res) and res[-1]))],lst,[]))

答案 4 :(得分:1)

该问题的答案已被接受,但我认为这将是一个很好的问题,也可以通过使用发电机来解决。可以接受的答案肯定是紧凑的,但我也很乐意提供这种解决方案。

lst = [20, 40, 110]

import math 

def highestPowerof2(lst): 
    last = 0
    for element in lst:
      p = int(math.log(element + last, 2))
      last = int(pow(2, p)) # Remember the last value
      yield last

lst_power2 = [i for i in highestPowerof2(lst)]
print(lst_power2)