在 python 的同一行中使用 if else for 和 del?
Using if else for and del in the same line in python?
我有一个列表,其项目是可变长度的列表。
如果这些可变长度的列表项超过此长度,则需要将其截断为特定长度 (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
但是,我可以在一行中以更 pythonic 的方式完成吗?
像这样:
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
我们将不胜感激。
您可能需要 eachEncodedAbstract[:MAX_LEN]
.
例如:
prefData = [eachEncodedAbstract[:MAX_LEN] if len(eachEncodedAbstract) > 510 else eachEncodedAbstract for eachEncodedAbstract in test_abstracts_encoded]
如果您不想修改 eachAbstract
对象而只想获得修剪后的版本,那么您可以使用以下方法:
truncated_list = [abstract[:trim_len] for abstract in train_abstracts_encoded]
请注意,这与您使用 del
的版本不同,因为它不会修改对象。
您仍然可以通过将公共部分移出 if/else
个分支来简化您的版本:
truncated_list = []
for eachAbstract in train_abstracts_encoded:
if len(eachAbstract) > trim_len:
del eachAbstract[trim_len:]
truncated_list.append(eachAbstract)
但是由于无论如何你都是就地修改对象,你可以只创建原始列表的副本然后循环它(这会稍微快一些因为 copy()
避免重复调用 append
,因此内部调整大小):
truncated_list = train_abstracts_encoded.copy()
for eachAbstract in truncated_list:
if len(eachAbstract) > trim_len:
del eachAbstract[trim_len:]
这里 train_abstracts_encoded
和 truncated_list
共享相同的对象。
我有一个列表,其项目是可变长度的列表。
如果这些可变长度的列表项超过此长度,则需要将其截断为特定长度 (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
但是,我可以在一行中以更 pythonic 的方式完成吗?
像这样:
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
我们将不胜感激。
您可能需要 eachEncodedAbstract[:MAX_LEN]
.
例如:
prefData = [eachEncodedAbstract[:MAX_LEN] if len(eachEncodedAbstract) > 510 else eachEncodedAbstract for eachEncodedAbstract in test_abstracts_encoded]
如果您不想修改 eachAbstract
对象而只想获得修剪后的版本,那么您可以使用以下方法:
truncated_list = [abstract[:trim_len] for abstract in train_abstracts_encoded]
请注意,这与您使用 del
的版本不同,因为它不会修改对象。
您仍然可以通过将公共部分移出 if/else
个分支来简化您的版本:
truncated_list = []
for eachAbstract in train_abstracts_encoded:
if len(eachAbstract) > trim_len:
del eachAbstract[trim_len:]
truncated_list.append(eachAbstract)
但是由于无论如何你都是就地修改对象,你可以只创建原始列表的副本然后循环它(这会稍微快一些因为 copy()
避免重复调用 append
,因此内部调整大小):
truncated_list = train_abstracts_encoded.copy()
for eachAbstract in truncated_list:
if len(eachAbstract) > trim_len:
del eachAbstract[trim_len:]
这里 train_abstracts_encoded
和 truncated_list
共享相同的对象。