Python扩展并用零填充列表以匹配另一个lis

2024-04-18 21:25:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含几个元素的列表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]

我需要

^{pr2}$

第一个非零元素在这里处于第三个位置,以匹配b变为等于或大于3,类似地,作为与b比较的结果,最后一个非零元素位于第五个位置。在

最后的输出总是len(b);如果开头的零太多而无法容纳所有的a,那么来自{}的元素将被删除。在


Tags: 元素示例列表len情况例子pr2
3条回答

使用二分法查找b中大于或等于a[0]的第一个位置,其中^{} module

import bisect

def zero_pad(a, b):
    pos = bisect.bisect(b, a[0])
    remainder = len(b) - len(a) - pos
    return ([0] * pos + a + [0] * remainder)[:len(b)]

对分可以在O(logN)时间内找到点。在

另一种方法是使用生成器函数;循环b并生成0s,直到找到与a[0]相等或更大的值,然后生成{},直到耗尽并返回零:

^{pr2}$

演示:

>>> a = [3, 4, 5]
>>> b = [1.2, 2.5, 3.7, 4.3, 5.1, 6.3, 7.3, 8.9]
>>> zero_pad(a, b)
[0, 0, 3, 4, 5, 0, 0, 0]
>>> list(zero_pad_gen(a, b))
[0, 0, 3, 4, 5, 0, 0, 0]

对于边缘情况;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]

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)

相关问题 更多 >