2017-10-07 203 views
1

我有一个列表a有几个元素。我有另一个列表b与更多的元素。我需要扩大a以匹配b的大小,使用零填充。在将出现的新列表中,原始a位于由b确定的位置,如以下示例所解释的。
的我的情况小例如:Python - 用零填充和填充列表以匹配另一个列表

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中的元素。

+0

那么你的输入列表是否被排序? –

+0

@MartijnPieters yes – johnhenry

+0

如果'a [pos] == b [pos]'会发生什么,所以'b'中有'3.0'? –

回答

1
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) 
2

使用二分法查找第一个位置b大于或等于a[0],与bisect 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和屈服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) 

演示:

>>> 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] 
+0

刚刚试过这个,我得到了[0,3,4,5,0,0,0] – johnhenry

+0

@johnhenry:啊,是的,因为我的部分有一个错误,因为'bisect_left'返回*之前的插入位置*。 –

+0

现在我得到[0,0,3,4,5,0,0] – johnhenry

1

试试这个

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

你可以使用list包容试试这个

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)