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

Python-替换嵌套列表中的特定元素,python,list,list-comprehension,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 = [

前言:我意识到这只是我在痴迷于做一些更像蟒蛇的东西

我有一个列表,如下所示:

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]
您可以尝试以下方法:

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]]
通过使用enumerate,您可以确定元素本身是否都等于“”,并验证引用的索引是否为3,这是第四个元素。

您可以尝试以下操作:

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]]

通过使用enumerate,您可以确定元素本身是否都等于“”,并验证引用的索引是否为3,这是第四个元素。

这可以用一种非常简单的方式完成,并且在所有子列表长度相同的情况下,启动性能非常好(在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”

更新-实际上,在相同的轨道上,您可以使其子列表大小不受影响,并替换最后一个元素,而无需预先知道元素的数量或它们是否不同:

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']]

这可以用一种非常简单的方式来完成,如果您的所有子列表长度相同,那么引导(几乎完全在C端以O(N)时间执行)的性能也相当好:

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”

更新-实际上,在相同的轨道上,您可以使其子列表大小不受影响,并替换最后一个元素,而无需预先知道元素的数量或它们是否不同:

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']]

不需要设置两个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]])

不需要设置两个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。这也将替换0。我相信这与我在OP中输入的循环解决方案相同。我试图找到一个列表理解来执行相同的操作。我相信这与我在OP中输入的循环解决方案相同。我试图找到一个列表理解来执行相同的操作。