Python 两个列表中的数字对

Python 两个列表中的数字对,python,list,Python,List,我有两份清单: a = [1,3,6,10,20] b = [2,4,9,12,15,22,24,25] 现在,我想创建一个新的列表,其中包含前两个列表中的对。对的定义如下: 左边的值[l,…]:a[i] 右[…,r]:如果a[i]存在,则b中a[i]和a[i+1]之间的最大数字,否则刚好大于a[i],如果a[i]存在,则刚好大于a[-1]且0

我有两份清单:

a = [1,3,6,10,20] 
b = [2,4,9,12,15,22,24,25] 
现在,我想创建一个新的列表,其中包含前两个列表中的对。对的定义如下:

  • 左边的值[l,…]:
    a[i]
  • 右[…,r]:如果
    a[i]
    存在,则
    b
    a[i]
    a[i+1]
    之间的最大数字,否则刚好大于
    a[i]
    ,如果
    a[i]
    存在,则刚好大于
    a[-1]
    0
结果如下所示:

pair = [[1,2],[3,4],[6,9],[10,15],[20,25]]
有人知道怎么做吗

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

a=[1,3,6,10,20]
b=[2,4,9,12,15,22,24,25]
成对=[]
计数器=0
对于范围内的i(最大值(len(a),len(b)):
尝试:
#得到一个[i]
ai=a[i]
除:
ai=a[-1]
尝试:
#获得[i+1]
ai1=a[i+1]
除:
ai1=b[-1]+1
温度=[]
对于b中的bi:
如果ai如果计数器您可以进行二进制搜索,因为数组已排序,您不必搜索
a[i]
,只需搜索
a[i+1]>b[j]
(如果
b
中没有元素,此代码将返回无效结果,
a[i]
):



下面是另一种方法:

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

merged = sorted(a + b, reverse=True)
mask = [(False, True)[x in a] for x in merged]


flag = True
good = []
for m, n in zip(mask, merged):
    if m is flag:
        continue
    else:
        good.append(n)
        flag = not flag

pairs = list(zip(good[1::2], good[::2]))[::-1]
pairs
>>> [(1, 2), (3, 4), (6, 9), (10, 15), (20, 25)]

首先,移除所有这些try/except块。我假设你有这些来处理数组边界的边缘情况。但是在实践中,你所能做的就是在你的代码中隐藏真正的bug。列表排序了吗?@FranciscoCouzo是的,它们排序了@塞尔比:是的。您知道如何更好地处理边缘情况吗?从编写代码开始,不要考虑边缘情况。然后识别边缘情况(列表末尾、空列表、未找到元素等),并使用条件(
if
else
)语句进行修复。这可以通过将
lo
参数传递到
bisect\u left
来进行一点优化,以便它从找到某个对象的最后一个位置开始搜索
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,3,6,10,20], [2,4,9,12,15,22,24,25])))
[(1, 2), (3, 4), (6, 9), (10, 15), (20, 25)]
a = [1,3,6,10,20] 
b = [2,4,9,12,15,22,24,25]

merged = sorted(a + b, reverse=True)
mask = [(False, True)[x in a] for x in merged]


flag = True
good = []
for m, n in zip(mask, merged):
    if m is flag:
        continue
    else:
        good.append(n)
        flag = not flag

pairs = list(zip(good[1::2], good[::2]))[::-1]
pairs
>>> [(1, 2), (3, 4), (6, 9), (10, 15), (20, 25)]