作为previous question的扩展,让我们说a
以2的恒定速率增加:
>>> a
>>> 0, 2, 4, 6, 8, 10 ...
b
但现在可以增加(随机)步骤,例如3
,4
或5
:
假设b
以step
的速率增加,那么它将具有以下值:
>>> 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==4
和b==3
时),与{step
的顺序无关1}} list(如果step = [5,4,3,4,3,5,4,5,3,...]
,最小差异仍为1
)。我可以在a
和b
都是整数时手动计算,当a
和/或b
包含小数时,问题就会出现。
理想情况下,函数将以这种方式调用:
>>> a = 2
>>> b = [3,4,5]
>>> my_fun(a,b)
>>> 1
a
和b
之间肯定会有一些数学关系可以给我这个结果,但不幸的是,我既不是数学也不是编程专家......
答案 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-b
和b-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])