我有这样的列表z = ['aaaaaa','bbbbbbbbbb','cccccccc']
我想从所有元素中删除前6个字符,如果元素为空则不放入另一个列表。所以我制作了这段代码:
[x[6:] if x[6:] is not '' else pass for x in z]
我已经尝试了
pass
continue
仍然是语法错误。也许有人可以帮助我吗?感谢
答案 0 :(得分:9)
每当您需要从列表中过滤项目时,条件必须在最后。所以你需要过滤空的项目,比如这个
[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 :(得分:1)
如果你正在学习lambda(不是官方链接),你应该尝试使用这样的地图和过滤器:
filter(None, map(lambda y: y[6:], x))
这里,地图(lambda y:y [6:],x)将仅保留第7个字符的字符串,并用布尔'False'替换其他较小的字符串。要从新列表中删除所有这些“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:])
请注意,即使传统方式看起来更大,它也可以添加更多值(例如,如果列表中包含其他数据类型,如列表,元组,词典等,则只从列表中获取字符串)
所以我建议要么坚持使用简单控制列表的列表推导或者控制输出的传统方式