Python 无法从列表中计算出最接近的数字
我正在编写一些代码,允许我从列表中选择最接近的数字,我已经成功地做到了这一点。但是,当找到最接近的数字并且它位于“myNumber”上方时,我希望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
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