Python - 替换嵌套列表推导中的特定元素

时间:2017-06-15 19:17:52

标签: python list list-comprehension

前言:我意识到这只是让我痴迷于制造更加诡异的东西。

我有一个像这样的列表列表:

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]

3 个答案:

答案 0 :(得分: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,这是第四个元素。

答案 1 :(得分: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']]

答案 2 :(得分: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]])