我刚刚开始学习 Python。
这是一个齿轮率计算器。
我有一个包含 367 到 7645373 范围内的 5000 个整数和一个原始分数的列表,它可以是 1/10 或 34561/43521 到 10/1。
我需要创建一个新分数,其值与原始分数接近,由表中存在的分子和分母组成。
事实上,我想要一个匹配列表,按照它与原始分数的偏差进行排序。
我有一个解决方案,但它需要很长时间才能给出值为 1/10 的结果,因为像 367/3670 或 368/3680 或 4352/43520 这样的解决方案是等价的。
Pythonist 会怎么做?
请不要告诉我这是 C 库的案例! :D
干杯
安东尼奥
def searcharatio(l, a):
b = []
mx = l[-1][0]
ln = l[0][0]
ld = l[0][0]
i = max(int(ln/a.numerator-1), int(ld/a.denominator)-1)
print i
while 1:
n = a.numerator * i
d = a.denominator * i
if n > mx or d > mx:
return sorted(b)
if n > 0.9*ln and d > 0.9*ld:
# enumerate es lista 2 elem 0=num orden, 1=elemento
ri = (min(enumerate(l), key=lambda x:abs(x[1][0]-n)))
ro = (min(enumerate(l), key=lambda x:abs(x[1][0]-d)))
ln = ri[1][0]
ld = ro[1][0]
e = [abs(1.0 - ((float(ln)/ld) / (float(n)/d))), i, ri, ro]
b.append(e)
i+=1
最佳答案
Python 在迭代时往往很慢;使用 NumPy 的矢量化解决方案可能会更快。
def search_ratio(l, a):
l = np.array(l)
t = l.astype(float).reshape(-1, 1) / l.reshape(1, -1)
i = np.unravel_index(np.argsort(np.where(t > a, t / a, a / t).flat), t.shape)
return l[i[0]], l[i[1]]
例如,search_ratio(range(2, 6), 1.3)
将给出:
(array([4, 5, 3, 5, 2, 3, 4, 5, 4, 4, 3, 5, 2, 3, 2, 2]),
array([3, 4, 2, 3, 2, 3, 4, 5, 2, 5, 4, 2, 3, 5, 4, 5]))
4/3
是最接近 1.3 的比率,5/4
是下一个最接近的比率,依此类推。
请注意,可用比率表 t
可以缓存以提高效率。
关于python - 从列表中获取分数近似值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14217667/