Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数返回两个列表元素之间的最小差异(第2部分)-python_Python_List_Function - Fatal编程技术网

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

函数返回两个列表元素之间的最小差异(第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 ... 是否可以编写

作为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 ...
是否可以编写一个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相同序列的生成器