加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python-两个列表中的数字对

发布时间:2020-12-17 17:41:59 所属栏目: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,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)]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读