我有一个喜欢的列表
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))]
答案 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)
您可能想要这样修改您的方法:
prev_power
和curr_num
(在您的代码中为n
)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)