在python的同一行中使用if-else for和del?

2024-09-27 23:01:29 发布

您现在位置: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

然而,我可以用一行代码,用一种更像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

任何帮助都将不胜感激


Tags: in列表forlenifelselistencoded
2条回答

如果您不想修改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共享相同的对象

您可能需要eachEncodedAbstract[:MAX_LEN]

Ex:

prefData = [eachEncodedAbstract[:MAX_LEN] if len(eachEncodedAbstract) > 510 else eachEncodedAbstract for eachEncodedAbstract in test_abstracts_encoded]

相关问题 更多 >

    热门问题