我有一个花车清单

l1 = [10.0, 50.0, 100.0]
l2 = [0.1, 0.5, 1.0]
l3 = [20.0, 100.0, 200.0]


所有人都应该返回:

i = [1, 5, 10]


以较小的为底乘数来获得整数的最有效方法是什么?或它们的倍数(如果不可能)

例:

n1 = [0.2, 0.3, 0.6]


应该回来

i = [2, 3, 6]




 n2 = [1424.56, 2136.84, 4985.96]


应该返回:

 i = [ 2, 3, 7] # 712.28 = 1


我正在使用value / min(l1),但在第二种情况和第三种情况下均无法使用

最佳答案

您可以将所有数字转换为整数,然后将每个数字除以它们的greatest common divisor (GCD)。避免浮点数是一个好主意,因为它们不能精确地表示许多小数。
fractions模块非常适合此功能:它可以处理小数和有理数,例如1/3和2/7。

#!/usr/bin/env python3

from fractions import Fraction, gcd
from functools import reduce

def lcm(a, b):
    return a * b // gcd(a, b)

def common_integer(*numbers):
    fractions = [Fraction(n).limit_denominator() for n in numbers]
    multiple  = reduce(lcm, [f.denominator for f in fractions])
    ints      = [f * multiple for f in fractions]
    divisor   = reduce(gcd, ints)
    return [int(n / divisor) for n in ints]


这会将每个数字转换为有理fraction,然后将其乘以其分母的最小公倍数(LCM)。有效地扩大了它们的大小,因此它们都是整数。然后,将它们按其集体GCD划分,并尽可能缩小规模。

例:

>>> common_integer('0.2', '0.3', '0.6')
[2, 3, 6]
>>> common_integer('1424.56', '2136.84', '4985.96')
[2, 3, 7]
>>> common_integer('2/7', '18/42', '1/3')
[6, 9, 7]


(使用limit_denominator()允许传递浮点数,甚至可以传递不精确的浮点数。不完全建议这样做,但是您可以省略引号,并使用0.2代替'0.2'1/3代替'1/3'。)

关于python - 如何从浮点数列表中获取python中的公共(public)整数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36551393/

10-13 09:46