【问题标题】:python list comprehensions invalid syntax while if statementpython列表推导在if语句时语法无效
【发布时间】:2014-10-19 11:20:21
【问题描述】:

我有这样的列表z = ['aaaaaa','bbbbbbbbbb','cccccccc'] 我想从所有元素中删除前 6 个字符,如果元素为空,则不要放入另一个列表。所以我做了这个代码:

[x[6:] if x[6:] is not '' else pass for x in z]

我试过了

pass continue

仍然是语法错误。也许有人可以帮助我吗?谢谢

【问题讨论】:

  • 您的标题有点误导:这个问题与 lambda 函数无关。你在考虑列表推导吗?
  • 好的,我改了标题,谢谢

标签: python string list list-comprehension


【解决方案1】:

如果您正在学习使用lambda(不是官方链接),您应该尝试使用这样的地图和过滤器:

filter(None, map(lambda y: y[6:], x))

这里,map(lambda y: y[6:], x) 将只保留第 7 个字符的字符串,并用布尔值 'False' 替换其他较小的字符串。要从新列表中删除所有这些“假”值,我们将使用过滤功能。

您只能将其用于学习目的,因为当考虑 Python 的 PEP8 时,这非常丑陋。列表理解是上面提到的方法。

[y[6:] for y in x if y[6:]]

或者传统的for循环为

output = []
for y in x:
    if isinstance(y, str) and y[6:]:
        output.append(y[6:])

请注意,尽管传统方式看起来更大,但它可以添加更多值(如这里,如果列表具有其他数据类型,如列表、元组、字典等,则仅从列表中获取字符串)

所以我建议要么坚持简单的受控列表的列表推导,要么坚持传统的受控输出方式

【讨论】:

    【解决方案2】:

    当您需要从列表中过滤项目时,条件必须位于末尾。所以你需要过滤空项目,像这样

    [x[6:] for x in z if x[6:] != ""]
    # ['bbbb', 'cc']
    

    由于空字符串是假的,我们可以将相同的条件简洁地写成如下

    [x[6:] for x in z if x[6:]]
    

    作为替代方案,正如 tobias_k 建议的那样,您可以像这样检查字符串的长度

    [x[6:] for x in z if len(x) > 6]
    

    【讨论】:

    • +1 或者,if len(x) > 6 可能会快一点?
    • 最终if x[6:] 更短 ;) 而且它的速度与 len(x) > 6 afaik 一样快。
    • @tobias_k 在答案中包含了该建议。谢谢:)
    • @Vladimir 实际上,x[6:](没有!= '')甚至更快。不过,我认为使用len 更清晰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2016-11-09
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    相关资源
    最近更新 更多