python-两个列表中的数字对

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

我有两个清单:

a = [1,3,6,10,20] 
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))
结果如下所示:

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

有人知道该怎么做吗?

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

a = [1,25]  

pairs = []
counter = 0
for i in range(max(len(a),len(b))):

try: 
    # get a[i]
    ai = a[i]
except: 
    ai = a[-1]

try: 
    # get a[i+1]
    ai1 = a[i+1]
except:
    ai1 = b[-1]+1

temp = []
for bi in b:

    if ai < bi and bi < ai1:
        temp.append(bi)

# Avoid adding the last element of b again and again until i = len(b)
if max(temp) == b[-1]:
    counter = counter +1

if counter <= 1:
    print(max(temp))
    pairs.append([ai,max(temp)])

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

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

import bisect

def pairs(a,b):
    for (a1,a2) in zip(a,a[1:]):
        yield a1,b[bisect.bisect_left(b,a2) - 1]

    yield a[-1],b[-1]

print(list(pairs([1,20],[2,25])))
[(1,2),(3,4),(6,9),(10,15),(20,25)]
原文链接:/python/533319.html

猜你在找的Python相关文章