2017-06-15 132 views
0

前言:我意識到這只是我癡迷於製造更加pythonic的東西。Python - 替換嵌套列表中的特定元素理解

我有一個列表的列表像這樣:

L = [[1,'',3,''],[1,2,'',4],[1,2,3,''],['',2,3,4]] 

我需要數字4只更換第4個元素,如果它是「」。

這可以用一個簡單的for循環來實現:

for row in L: 
    if row[3] =='': 
     row[3] = 4 

我如何通過嵌套列表理解實現這一目標?

我最好的嘗試是以下幾點,但是它會產生一個列表,其中所有值都用'4'取代,而不是特定的元素。

L = [[4 if x=='' else x for x in y] for y in L] 

回答

0

這可以用非常簡單的方式來完成,相當高性能,以啓動(在O(N)時間執行幾乎完全在C面),如果您的所有子列表的長度是相同的:

L = [[1, '', 3, ''], [1, 2, '', 4], [1, 2, 3, ''], ['', 2, 3, 4]] 

L2 = [[e0, e1, e2, 4 if e3 == "" else e3] for e0, e1, e2, e3 in L] 
# [[1, '', 3, 4], [1, 2, '', 4], [1, 2, 3, 4], ['', 2, 3, 4]] 

但是,Pythonic是一個虛幻的術語,對不同的人意味着不同的事物 - 將所有東西都塞進單行內不一定是'Pythonic'。

UPDATE - 實際上,要在同一軌道上,你可以把它的子列表大小無關,並替換最後一個元素不知道的前期元素的數量或如果他們甚至有所不同:

L = [[1, '', 3, ''], [1, 2, ''], [1, 2, 3, '', 5], ['', 2, 3, 4, 5, '']] 

L2 = L2 = [e[:-1] + ["FOO" if e[-1] == "" else e[-1]] for e in L] 
# [[1, '', 3, 'FOO'], [1, 2, 'FOO'], [1, 2, 3, '', 5], ['', 2, 3, 4, 5, 'FOO']] 
+0

這也將取代0 –

+0

@Błotosmętek - 好點的,固定的。 – zwer

+0

@zwer這正是我所期待的。謝謝!!! – ThousandFacedHero

2

你可以試試這個:

L = [[1,'',3,''],[1,2,'',4],[1,2,3,''],['',2,3,4]] 

new_l = [[4 if b == '' and c == 3 else b for c, b in enumerate(d)] for d in L] 

輸出:

[[1, '', 3, 4], [1, 2, '', 4], [1, 2, 3, 4], ['', 2, 3, 4]] 

使用枚舉,您可以確定如果兩個元素本身就是等於'和驗證指標的發生是3,這是第四個因素。

0

沒有必要把兩個for循環,這可以用一個循環只取得

def lis(L): 
    for y in L: 
     if y[3] == '': 
      y[3] = 4 
print L 

lis([[1,'',3,''],[1,2,'',4],[1,2,3,''],['',2,3,4]]) 
+0

我相信這與我在OP中的循環解決方案是一樣的。我試圖找到一個列表理解來做同樣的事情。 – ThousandFacedHero