我正在制作一些代码,允许我从列表中选择最接近的数字,我已设法做到这一点.但是当找到最接近的数字并且它超过'myNumber'时,我希望python在它之前打印出列表中的数字.
例如;
如果我有一个清单;
TwoN = [1,2,4,8,16,32,64,128,256,512, 1024, 2048, 4096, 8192]
Run Code Online (Sandbox Code Playgroud)
和
myNumber = 30
Run Code Online (Sandbox Code Playgroud)
我希望python打印16而不是32
这是我到目前为止所做的代码......
TwoN = []
for i in range(12):
TwoN.append(2**i)
print(TwoN)
myNumber = 30
closest = TwoN[0]
for i in range(1, len(TwoN)):
if abs(TwoN[i] - myNumber) < abs(closest - myNumber):
closest = TwoN[i];
Sum = myNumber - closest
if Sum < 0:
closest = TwoN[(i-1)]
print(closest)
else:
print(closest)
Run Code Online (Sandbox Code Playgroud)
当myNumber = 30时,程序将输出1024,当我希望它输出16 ..
任何帮助表示赞赏谢谢
您可以使用带有条件的简单列表推导来过滤掉更大的数字并返回其余数字的最大值:
TwoN = [1,2,4,8,16,32,64,128,256,512, 1024, 2048, 4096, 8192]
def closestLowerNr(data,num):
"""returns from data the biggest number smaller/equal to num"""
return max( nr for nr in data if nr <= num) # get max of nr that are smaller/equal
print(closestLowerNr(TwoN,38))
Run Code Online (Sandbox Code Playgroud)
该if nr <= number丢弃任何东西,是更大然后想要的号码,max( ... )给你剩下的最大数量.
你也可以只通过你的清单一次,得到低于你的最高数字以及高于你的数字:
TwoN = []
for i in range(12):
TwoN.append(2**i)
print(TwoN)
myNumber = 32
belowMine = None
aboveMine = None
# this is almost always preferable to a range(len(list)) loop
for nr in TwoN: # if you really need an index use for i,v in enumerate(list):
if not belowMine or nr > belowMine: # get lower bound closest to myNumber
if nr < myNumber:
belowMine = nr
if not aboveMine or nr < aboveMine: # get upper bound closest to myNumber
if nr > myNumber:
aboveMine = nr
if nr == myNumber: # exact match, we are done
belowMine = nr
aboveMine = nr
break
if nr == myNumber:
print ("Found:",nr)
else:
print ("Closest numbers to ",myNumber," found:", belowMine,aboveMine)
Run Code Online (Sandbox Code Playgroud)
输出:
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]
Found: 32
# or
Closest numbers to 30 found: 16 32
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |