2017-06-15 99 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