2017-10-07 201 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)