Python 无法从列表中计算出最接近的数字

Python 无法从列表中计算出最接近的数字,python,python-3.x,Python,Python 3.x,我正在编写一些代码,允许我从列表中选择最接近的数字,我已经成功地做到了这一点。但是,当找到最接近的数字并且它位于“myNumber”上方时,我希望python打印出它前面列表中的数字 比如, 如果我有一份清单 TwoN = [1,2,4,8,16,32,64,128,256,512, 1024, 2048, 4096, 8192] 及 我希望python打印16而不是32 这是我到目前为止所做的代码 TwoN = [] for i in range(12): TwoN.append(2

我正在编写一些代码,允许我从列表中选择最接近的数字,我已经成功地做到了这一点。但是,当找到最接近的数字并且它位于“myNumber”上方时,我希望python打印出它前面列表中的数字

比如,

如果我有一份清单

TwoN = [1,2,4,8,16,32,64,128,256,512, 1024, 2048, 4096, 8192]

我希望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)
TwoN=[]
对于范围(12)内的i:
两个附加(2**i)
打印(两张)
myNumber=30
最近的=TwoN[0]
对于范围(1,len(TwoN))中的i:
如果abs(TwoN[i]-myNumber)
当myNumber=30时,当我希望程序输出16时,程序将输出1024


感谢您的帮助。您可以使用一个简单的列表理解,并附带一个条件,筛选出较大的数字并返回剩余数字的最大值:

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)) 
输出:

[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]
Found: 32
# or 
Closest numbers to  30  found: 16 32
您可以使用以下模块:


bisect.bisect
返回列表值右侧的
myNumber
插入点,在该点之后必须插入该点以保持其有序。因此,我们只需减去1,就可以得到列表中小于或等于
myNumber
的最大值的索引

正如@abarnert所提到的,如果对其进行排序,则很容易找到

for i in TwoN:
    if i < 30:
        seen = i
    else:
        print seen
        break

>16
对于一对一:
如果i<30:
seen=i
其他:
印鉴
打破
>16

如果希望30打印出16而不是32,则不希望使用检查最小绝对差的算法,而是希望得到比正的最小差。摆脱那些
abs
调用,并添加一个测试
和>=0
。此外,您的数字列表是否保证按如下方式排序?如果是这样的话,你可以利用这个机会。相关人士:非常感谢你,你的回复非常有帮助。非常感谢。
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]
Found: 32
# or 
Closest numbers to  30  found: 16 32
import bisect

TwoN = [1,2,4,8,16,32,64,128,256,512, 1024, 2048, 4096, 8192]
myNumber = 30

print(TwoN[bisect.bisect(TwoN, myNumber) - 1])
# 16
for i in TwoN:
    if i < 30:
        seen = i
    else:
        print seen
        break

>16