函数返回两个列表的元素之间的最小差异(第2部分) - python

时间:2013-09-13 17:34:27

标签: python list function

作为previous question的扩展,让我们说a以2的恒定速率增加:

>>> a
>>> 0, 2, 4, 6, 8, 10 ...

b但现在可以增加(随机)步骤,例如345: 假设bstep的速率增加,那么它将具有以下值:

>>> step = [3, 4, 5, 5, 3, 4, 3, 5, 4, ...]
>>> b
>>> 0, 3, 7, 12, 17, 20, 24, 27, 32, 36 ...

是否有可能编写一个python函数,它可以获得a-b(大于零)的最小正差,而不管step阶?

在上述情况中,a-b的最小可能差异为1(例如,a==4b==3时),与{step的顺序无关1}} list(如果step = [5,4,3,4,3,5,4,5,3,...],最小差异仍为1)。我可以在ab都是整数时手动计算,当a和/或b包含小数时,问题就会出现。

理想情况下,函数将以这种方式调用:

>>> a = 2
>>> b = [3,4,5]
>>> my_fun(a,b)
>>> 1

ab之间肯定会有一些数学关系可以给我这个结果,但不幸的是,我既不是数学也不是编程专家......

1 个答案:

答案 0 :(得分:1)

首先,您需要如何组合两个列表中的每个元素。

在任何语言中,您都可以这样做:

li=[]
for x in [1,2,3]:
    for y in [10,20]:
       li.append((x,y))    

print li
# [(1, 10), (1, 20), (2, 10), (2, 20), (3, 10), (3, 20)]

Python为您提供了一个名为itertools.product的精彩快捷方式,它生成与上面嵌套for循环相同的嵌套列表:

>>> import itertools
>>> print li==list(itertools.product([1,2,3],[10,20])) 
True

然后使用itertools.product,只需减去并测试元组列表:

>>> a=[0,2,4,6,8]
>>> b=[0, 3, 7, 12, 17, 20, 24]
>>> min(ax-bx for ax,bx in itertools.product(a,b) if ax-bx>0)
1

如果您想查看a,b的哪个值产生最小值:

>>> min(((ax-bx,'when a={}, b={}'.format(ax,bx))
...     for ax,bx in itertools.product(a,b) 
...     if ax-bx>0), key=lambda t:t[0])
(1, 'when a=4, b=3')

如果您想要包含a-bb-a的值,只需使用绝对值:

print min(((abs(ax-bx),'when a={}, b={}'.format(ax,bx)) 
            for ax,bx in itertools.product(a,b) 
            if ax-bx!=0), key=lambda t:t[0])