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)]