在 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_encodedtruncated_list 共享相同的对象。