Используя if else для и del в одной строке в python? - PullRequest
0 голосов
/ 12 марта 2020

У меня есть список, элементы которого являются списками переменной длины.

Эти элементы списка переменной длины должны быть усечены до определенной c длины (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

Однако, могу ли я сделать это в одной строке и более pythoni c способом?

как это:

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

Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

Вам, вероятно, нужно eachEncodedAbstract[:MAX_LEN].

Пример:

prefData = [eachEncodedAbstract[:MAX_LEN] if len(eachEncodedAbstract) > 510 else eachEncodedAbstract for eachEncodedAbstract in test_abstracts_encoded]
1 голос
/ 12 марта 2020

Если вы не хотите изменять 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)

Но поскольку вы модифицируете объекты В любом случае на месте вы можете просто создать копию исходного списка, а затем l oop поверх него (это будет немного быстрее, потому что 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 совместно используют одни и те же объекты.

...