2017-08-03 117 views
3

的值替換空值我有兩個列表列表中的另一個列表

lis1 = [12,34,56,89] 
lis2 = [10,34,90,108,None,None,None,None] 

如何更換使用的lis1None值,而不會創建任何新的列表?

最終的結果應該是

lis2 = [10,34,90,108,12,34,56,89] 

到目前爲止我試過

lis2 = [i for j in lis2 for i in lis1 if j is None] 

但是這給了我一個不正確的列表。

回答

2

這裏是一個可能的辦法:

In [870]: lis2[lis2.index(None):] = lis1 

In [871]: lis2 
Out[871]: [10, 34, 90, 108, 12, 34, 56, 89] 

子片分配。這裏的假設是lis2具有儘可能多的None值,因爲lis1具有元素並且它們都位於最後。


進行分解:

  1. lis2.index(None)返回列表中的None第一指數

    In [873]: lis2.index(None) 
    Out[873]: 4 
    
  2. 您可以獲取的lis1這樣子切片:

    In [874]: lis2[lis2.index(None):] 
    Out[874]: [None, None, None, None] 
    
  3. 只需重新分配lis2即可。

+0

@COLDSPEED你能解釋我的第一行代碼嗎? –

+0

@SouvikRay編輯我的答案與解釋。 –

+2

@coldspeed什麼是'None'在lis2中洗牌? – voidpro

1

這是一種方法。

> lis1 = [12,34,56,89] 
> lis2 = [10,34,90,108,None,None,None,None] 
> lis2 = [x for x in lis2 if x is not None] 
> lis2 
=> [10, 34, 90, 108] 
> lis2 += lis1 
> lis2 
=> [10, 34, 90, 108, 12, 34, 56, 89] 

首先從lis2中刪除所有None。然後用lis1

+1

這不會從'lis2'刪除任何元素。它只是創建一個新列表並將其分配給'lis2'變量。 –

+0

@PaulRooney多數民衆贊成正確。 'lis2'將被重新分配新的值。 – voidpro

+0

是的,如果內存空間不是問題,即使這可以被接受。 –

1

延長lis2(擴大在COLDSPEED的答案,這是清潔,如果所有的諾內斯都在列表的末尾。)

# Replace Nones in list 2 with elements from list 1 
> lis1 = [2, 3, 6, 8] 
> lis2 = [1, None, None, 4, 5, None, 7, None] 

# Index of next element to use from list 1 
> j = 0 

> for i in range(len(lis2)): 
    if lis2[i] == None: 
     lis2[i] = lis1[j] # Replace a None with something from list 1 
     j += 1 # Use the following element next time 

> lis2 
[1, 2, 3, 4, 5, 6, 7, 8] 

同樣,你必須做一些檢查,如果它是不能保證該列表1的長度是一樣的None S IN列表中的號碼2.

+0

如果'lis2'中'None'的數量大於'lis1'中的元素數? – voidpro

+0

你會得到'列表索引超出範圍'的錯誤。如果你想確保沒有發生,只要'j == len(lis1)'''就可以'斷開'循環。 –

1

較短的方式:

lis2 = [1, None, None, 4, 5, None, 7, None] 
lis1 = [2, 3, 6, 8] 
list2 =[i if i else lis1.pop(0) for i in lis2] 
print(list2) 

輸出:

[1, 2, 3, 4, 5, 6, 7, 8]