前言:我意识到这只是让我痴迷于制造更加诡异的东西。
我有一个像这样的列表列表:
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 :(得分: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]])