Python—用零扩展和填充列表以匹配另一个列表

Python—用零扩展和填充列表以匹配另一个列表,python,arrays,list,padding,Python,Arrays,List,Padding,我有一个包含一些元素的列表a。我有另一个包含更多元素的列表b。我需要扩展a以匹配b的大小,使用零填充。在即将出现的新列表中,原始的a位于由b确定的位置,如下例所示。 我的情况的一个小例子: a = [3, 4, 5] b = [1.2, 2.5, 3.7, 4.3, 5.1, 6.3, 7.3, 8.9] 我需要 [0, 0, 3, 4, 5, 0, 0, 0] 第一个非零元素位于第三位,以匹配b等于或大于3的位置,同样,最后一个非零元素位于第五位,这是与b比较的结果 最终输出总是len(

我有一个包含一些元素的列表
a
。我有另一个包含更多元素的列表
b
。我需要扩展
a
以匹配
b
的大小,使用零填充。在即将出现的新列表中,原始的
a
位于由
b
确定的位置,如下例所示。
我的情况的一个小例子:

a = [3, 4, 5]

b = [1.2, 2.5, 3.7, 4.3, 5.1, 6.3, 7.3, 8.9]
我需要

[0, 0, 3, 4, 5, 0, 0, 0]
第一个非零元素位于第三位,以匹配
b
等于或大于3的位置,同样,最后一个非零元素位于第五位,这是与
b
比较的结果

最终输出总是
len(b)
;如果开始处的零太多,无法容纳所有
a
,则删除
a
中的元素。

a=[3,4,5]
a = [3, 4, 5]
b = [1.2,2.5,3.7,4.3,5.1,6.3,7.3,8.9]

b.sort()  # Ensure they are sorted

start_zero_till = len(b) - len(a)
for i in range(len(b)):
    if a[0] < b[i]:
        start_zero_till = i
        break

revised_a = [0] * start_zero_till
revised_a.extend(a)
revised_a.extend([0] * (len(b) - len(revised_a)))

print(revised_a)
b=[1.2,2.5,3.7,4.3,5.1,6.3,7.3,8.9] b、 排序()#确保它们已排序 开始至=len(b)-len(a) 对于范围内的i(len(b)): 如果a[0]
使用二分法查找
b
中大于或等于
a[0]
的第一个位置,其中

二分法可以让您在O(logN)时间内找到点

另一种方法是使用发电机功能;循环
b
并产生
0
s,直到找到与
a[0]
相等或更大的值,然后产生
a
直到用尽并返回到零:

def zero_pad_gen(a, b, _sentinel=object()):
    a = iter(a)
    nexta = next(a, _sentinel)
    for bval in b:
        if nexta is _sentinel or bval < nexta:
            yield 0
        else:
            yield nexta
            nexta = next(a, _sentinel)
对于边缘情况<代码>b太短,从
a中删除值

>>> zero_pad(a, b[:-4])
[0, 0, 3, 4]
>>> list(zero_pad_gen(a, b[:-4]))
[0, 0, 3, 4]
b
匹配的第一个值:

>>> zero_pad([1, 2] + a, b)
[1, 2, 3, 4, 5, 0, 0, 0]
>>> list(zero_pad_gen([1, 2] + a, b))
[1, 2, 3, 4, 5, 0, 0, 0]
试试这个

for i in b:
    if int(i) not in a:
        a.insert(b.index(i),0)

您可以尝试使用列表理解

a = [3, 4, 5]
b = [1.2, 2.5, 3.7, 4.3, 5.1, 6.3, 7.3, 8.9]
num=[c for c,e in enumerate(b) if e>=a[0]][0]
c=[0 for e in range(num)]+a+[0 for e in range(len(b)-num-len(a))]
print(c)

那么您的输入列表就被排序了?@MartijnPieters是的,如果
a[pos]==b[pos]
会发生什么,那么
b
中有一个
3.0
?@MartijnPieters那么“pos”将是第一个非零元素的位置,如果
b
有超过3个元素超出
a
的“范围”,会发生什么?说
b=[0.1,2.1,3.0,3.5,4.1,5.8,6.6,7]
?或者您基本上是将
a[0]
b
中的值对齐,然后匹配长度吗?@johnhenry:啊,是的,我有一个错误,因为
bisect\u left
返回之前的插入位置。@johnhenry:全部修复。
for i in b:
    if int(i) not in a:
        a.insert(b.index(i),0)
a = [3, 4, 5]
b = [1.2, 2.5, 3.7, 4.3, 5.1, 6.3, 7.3, 8.9]
num=[c for c,e in enumerate(b) if e>=a[0]][0]
c=[0 for e in range(num)]+a+[0 for e in range(len(b)-num-len(a))]
print(c)