python - 从列表中获取分数近似值

标签 python list matching

我刚刚开始学习 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/

相关文章:

python - 使用回溯的唯一排列

c# - 通过 for 循环初始化带有 Lists<int> 的交错数组

python - 我们如何获取特定索引列表的元素?

python - 连 catch 体表面上的两点

python - 我需要创建一个列表,其中包含一次取三个列表的所有总和,即添加前 3 个元素,然后添加下 3 个

python - 使用Python字典编辑图像

javascript - 使用动态创建的 .addEventListener

python - 检查某些文本是否仅由某些模式组成

Perl 函数参数消失。为什么?

R找到超过2个向量的匹配项