我想解决这个问题,
lst = [['1','2','3'], ['1','2','3','4']]
print [ls for ls in lst if (len(ls)==3) ls.insert(2,"Null")]
但是它出现了以下错误,
[ls for ls in lst if (len(ls)==3) ls.insert(2, 'null')]
^
SyntaxError: invalid syntax
答案 0 :(得分:4)
基本上,这不是列表推导的工作方式。它们是什么,粗略地说:
[ expression for identifier in expression <if condition> ]
你拥有的是:
[ expression for identifier in expression if condition expression ]
哪种语法无效。
你想要的也不完全清楚。如果您想要新列表仅包含len&gt;的子列表3然后你可以这样做:
from itertools import chain
new_list = [ list(chain(ls, 'Null')) for ls in lst if len(ls) == 3 ]
如果您希望结果与原始列表的相同,则仅使用len&gt;修改了3个子列表:
from itertools import chain
new_list = [
list(chain(ls, 'Null') if len(ls) == 3 else ls)
for ls in lst
]
这两种方法都会使原始列表lst
及其子列表保持不变。
如果 打算修改原始列表,那么你一定要遵循Abhijit的建议并使用循环。
经验法则:如果您正在使用列表推导并丢弃结果,那么您真的应该使用循环结构。
答案 1 :(得分:3)
对副作用使用列表理解是一个坏主意。你应该使用Loop来实现你的目的
首先你的语法错误
[ls for ls in lst if (len(ls)==3) ls.insert(2, 'null')]
应该写(让我们忽略坏主意部分)
[ls.insert(2, 'null') for ls in lst if (len(ls)==3) ]
但是,你最终会创建一个Nones列表,这是一种资源浪费。
相反,你应该做
for ls in lst:
if len(ls) == 3:
ls.insert(2, 'null')
答案 2 :(得分:0)
也许
[ls + (['null'] if len(ls)==3 else []) for ls in lst]
这会在每个长度为3的子列表的末尾添加一个元素'null'
。