列表理解表达错误

时间:2014-01-30 05:46:36

标签: python list-comprehension

我想解决这个问题,

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

3 个答案:

答案 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'