函数返回两个列表的元素之间的最小差异 - python

时间:2013-09-12 18:11:00

标签: python function

假设ab分别以2s和3s的恒定速率记录:

>>> a
0, 2, 4, 6, 8, 10, 12
>>> b
0, 3, 6, 9, 12

我想在python中编写一个返回

的函数
  1. a-b
  2. 的最小正差(即,大于零)
  3. b达到相同a值的实例数。
  4. 所以在上一个例子中,

    1. a-b的最小差异为1,即a==4b==3(或a==10b==9
    2. 需要b的3个实例才能达到a的相同值(即0, 3, 6)。
    3. 理想情况下,我想以这种方式使用该功能:

      a = 2
      b = 3
      >>> my_fun(a,b)
      >>> [1, 3] #1-smallest difference, 3-number of instances
      

2 个答案:

答案 0 :(得分:2)

使用this answer中的lcm()功能:

def my_fun(a, b):
    n = lcm(a, b)
    arange = range(0, n+1, n // a if n > a else a)
    brange = range(0, n+1, n // b if n > b else b)
    m = min(x - y for x in arange for y in brange if x > y)
    return [m, n//b + 1]

这假设您的值ab是整数,如果您需要对浮点数执行此操作,只需乘以10的幂来使它们成为整数。例如,对于a=2.34b=3.73,您将乘以100,运行my_fun(234, 373),然后将结果的第一个值除以100(第二个值可以按原样使用)。

以下是lcm()函数及其依赖的gcd()函数:

def gcd(a, b):
    """Return greatest common divisor using Euclid's Algorithm."""
    while b:      
        a, b = b, a % b
    return a

def lcm(a, b):
    """Return lowest common multiple."""
    return a * b // gcd(a, b)

答案 1 :(得分:2)

def worker(a, b):
    i, j, k = a, b, a
    while a != b:
        if a < b:
            a += i
        else:
            n = a - b
            k = n if not k else min(k, n)
            b += j

    return k, b / j + 1

>>> worker(4, 4)
(4, 2)
>>> worker(2, 3)
(1, 3)