Или с next()
:
l = ['Some long text', 'often begins', ' with ', 'impenetrable fog ',
'which ends', ' somewhere further']
startIndex = next((u for u, v in enumerate(l) if 'begins' in v), 0)
finalIndex = next((u for u, v in enumerate(l) if 'ends' in v), 0)
if (startIndex and finalIndex) and (finalIndex > startIndex):
sentence = ' '.join(l[startIndex:finalIndex])
else:
sentence = None
print(sentence)
Похожие в списке понимание, execpt не возвращает список, но первый элемент он найден. если он не нашел ничего, он возвращает дополнительный элемент (здесь '0'
)
Таким образом, если нет 'begins'
или в списке нет 'ends'
, вы не должны печатать ничего. Таким образом, это позволяет проверить, если 'ends'
подходит к 'begins'
.
Я также люблю просмотр списка, но иногда то, что вам нужно, это не список.
РЕШЕНИЕ ДЛЯ ПРЕДВАРИТЕЛЬНОГО ПОЛЬЗОВАТЕЛЯ:
Проблема с использованием двух списка понимания, что вы проверить дважды список от начала и она не будет выполнена, когда ends
приходит перед стартом:
l = ['Some long text ends here', 'often begins', ' with ', 'which ends']
^^^
Чтобы избежать этого, вы можете использовать генератор с send()
, чтобы повторять только один раз в вашем списке.
def get_index(trigger_word):
for u, v in enumerate(l):
if trigger_word in v:
trigger_word = yield u
gen = get_index('begins')
startIndex = gen.send(None)
finalIndex = gen.send('ends')
Здесь yield
позволяет получить индекс, не выходя из функции.
Это лучше, но если в списке begins
или ends
, будет исключение StopIteration. Чтобы этого избежать, вы можете просто сделать бесконечный цикл на yield
0. Теперь полное решение будет:
def get_index(l, trigger_word):
for u, v in enumerate(l):
if trigger_word in v:
trigger_word = yield u
while True:
yield 0
def concat_with_trigger_words(l):
gen = get_index(l, 'begins')
startIndex = gen.send(None)
finalIndex = gen.send('ends')
return ' '.join(l[startIndex:finalIndex]) if (startIndex and finalIndex) else None
# Here some list for free lists for your future unitary tests ;)
l_orignal = ['Some long text here', 'often begins', ' with ',
'impenetrable fog ', 'which ends', ' somewhere further']
l_start_with_ends = ['ends', 'often begins', ' with ',
'impenetrable fog ', 'which ends', 'begins']
l_none = ['random', 'word']
l_without_begin = ['fog', 'ends here']
l_without_end = ['begins', 'but never' '...']
print(concat_with_trigger_words(l_orignal)) # often begins with impenetrable fog
print(concat_with_trigger_words(l_start_with_ends)) # often begins with impenetrable fog
print(concat_with_trigger_words(l_none)) # None
print(concat_with_trigger_words(l_without_end)) # None
print(concat_with_trigger_words(l_without_begin)) # None
Можете ли вы предоставить наглядный пример? Вы хотите, чтобы все «строки» в «списке» находились между строкой 'start' и' end'.Например: '['How May', 'I help', 'You with', 'Your Problem', 'Andreas']'. С start = 'help' и end =' Problem'. Каким должен быть ваш необходимый результат? –
Да, я хотел бы получить «Вы с вашей проблемой» в качестве вывода с вашим примером. Спасибо, что ответили! –
Кстати, что вы уже пробовали с помощью карт и лямбда-функций? –