函数返回两个列表元素之间的最小差异(第2部分)-python
作为my的扩展,假设a以2的恒定速率增加:函数返回两个列表元素之间的最小差异(第2部分)-python,python,list,function,Python,List,Function,作为my的扩展,假设a以2的恒定速率增加: >>> a >>> 0, 2, 4, 6, 8, 10 ... 然而,b现在可以有一个随机阶跃增加,例如,3、4或5: 假设b以阶跃速率增加,则其将具有以下值: >>> step = [3, 4, 5, 5, 3, 4, 3, 5, 4, ...] >>> b >>> 0, 3, 7, 12, 17, 20, 24, 27, 32, 36 ... 是否可以编写
>>> a
>>> 0, 2, 4, 6, 8, 10 ...
然而,b现在可以有一个随机阶跃增加,例如,3、4或5:
假设b以阶跃速率增加,则其将具有以下值:
>>> step = [3, 4, 5, 5, 3, 4, 3, 5, 4, ...]
>>> b
>>> 0, 3, 7, 12, 17, 20, 24, 27, 32, 36 ...
是否可以编写一个python函数,使a-b的最小可能正差大于零,而不考虑阶跃顺序
在上述情况下,a-b的最小可能差值为1,例如,当a==4和b==3时,无论步骤列表的顺序如何,如果步骤=[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之间肯定存在某种数学关系,这会给我这个结果,但不幸的是,我既不是数学专家也不是编程专家…首先,你需要知道如何组合两个列表中的每个元素 在任何语言中,您都可以执行以下操作:
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为您提供了一个奇妙的快捷方式,名为,它生成与上面的嵌套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])
按原样,它只检查ax>bx的距离,而不是相反。当a增加2时,这实际上并不重要,但是,你可以使它成为minabsax bx…如果ax bx=0表示更一般的情况。但是,嘿,他确实特别要求a-b。@Brian:这是一个很好的评论+1修复…我会保留你的原创并做个记录。再读一遍这个问题,你的原稿可能就是他感兴趣的东西。@drewk:非常感谢!但是,如果b已经是一个列表,并且包含的值将使a-b的差异最小,那么代码就可以工作。在大多数情况下,我根本无法访问该列表,我只知道b可以采取什么增量,例如,[3,4,5]。另外,如果b不是整数,我需要创建一个巨大的列表,因为一个元素很少的列表可能不包含b的值,这将使a-b的差异最小。这有意义吗?然后构造一个表示与b相同序列的生成器