【发布时间】:2020-03-12 10:33:15
【问题描述】:
我有一个列表,其中的项目是可变长度的列表。
如果这些可变长度的列表项超过此长度,则需要将其截断为特定长度 (x)。
我已经做了这个小功能。
def truncateList(batch_, trim_len):
truncated_list = []
for eachAbstract in train_abstracts_encoded:
if len(eachAbstract) > trim_len:
del eachAbstract[trim_len:]
truncated_list.append(eachAbstract)
else:
truncated_list.append(eachAbstract)
return truncated_list
但是,我可以在一行中以更 Python 的方式完成吗?
像这样:
prefData = [ del eachEncodedAbstract[MAX_LEN:] if len(eachEncodedAbstract) > 510 else eachEncodedAbstract for eachEncodedAbstract in test_abstracts_encoded]
但这不起作用,我收到错误。
prefData = [ del eachEncodedAbstract[MAX_LEN:] if len(eachEncodedAbstract) > 510 else eachEncodedAbstract for eachEncodedAbstract in test_abstracts_encoded]
^
SyntaxError: invalid syntax
我们将不胜感激。
【问题讨论】:
-
这已经是最 Pythonic 的方式了。仅仅因为它们适合单行而编写复杂(神秘)的理解并不是最佳实践。不过有一个提示:由于
runcated_list.append(eachAbstract)是两个if/else分支共有的,因此您可以将其移出,从而完全摆脱else分支。 -
del是一个语句,而不是一个表达式。您不能在理解中使用语句 - 只能使用表达式 -
你为什么
del eachAbstract[trim_len:]?你为什么不直接.append(eachAbstract[:trim_len])?你真的需要修剪对原始数据可见吗? -
"但是,我可以在一行中以更 Pythonic 的方式完成吗?"单行!= pythonic。列表推导和相关表达式(dict /set推导和生成器表达式)旨在简洁地创建映射/过滤操作。它们不是意味着“单行循环”。习惯上,它们应该是函数式转换,即没有副作用,因为这些是函数式编程结构。
del是非常必要的事情。
标签: python python-3.x list truncate