python-两个列表中的数字对

前端之家收集整理的这篇文章主要介绍了python-两个列表中的数字对 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有两个清单:

  1. a = [1,3,6,10,20]
  2. b = [2,4,9,12,15,22,24,25]

现在,我想创建一个新列表,其中包含前两个列表中的对.对的定义如下:

>左值[l,..]:a [i]
>右边的[..,r]:如果a [i 1]存在,则a [i]和a [i 1]之间b中的最高数字,如果a [i]存在,则比a [i]大,否则仅比a [-1]大,且0 <我<最大(len(a),len(b))
结果如下所示:

  1. pair = [[1,2],[3,4],[6,9],[10,15],[20,25]]

有人知道该怎么做吗?

到目前为止,这是我所做的:

  1. a = [1,25]
  2. pairs = []
  3. counter = 0
  4. for i in range(max(len(a),len(b))):
  5. try:
  6. # get a[i]
  7. ai = a[i]
  8. except:
  9. ai = a[-1]
  10. try:
  11. # get a[i+1]
  12. ai1 = a[i+1]
  13. except:
  14. ai1 = b[-1]+1
  15. temp = []
  16. for bi in b:
  17. if ai < bi and bi < ai1:
  18. temp.append(bi)
  19. # Avoid adding the last element of b again and again until i = len(b)
  20. if max(temp) == b[-1]:
  21. counter = counter +1
  22. if counter <= 1:
  23. print(max(temp))
  24. pairs.append([ai,max(temp)])

没关系,因为它可以完成工作,但是我想知道,是否有更好,更有效的方法

最佳答案
您可以进行二进制搜索,因为对数组进行了排序,因此无需搜索a [i]< b [j],仅当a [i 1]> b [j](如果b中没有元素使得a [i]< b< a [b 1],则此代码将返回无效结果):

  1. import bisect
  2. def pairs(a,b):
  3. for (a1,a2) in zip(a,a[1:]):
  4. yield a1,b[bisect.bisect_left(b,a2) - 1]
  5. yield a[-1],b[-1]
  6. print(list(pairs([1,20],[2,25])))
  1. [(1,2),(3,4),(6,9),(10,15),(20,25)]

猜你在找的Python相关文章