Просто переберите все в индексы в списке и сравните срез с startSequence
или endSequence
, соответственно. Предполагая, что подписи не должны перекрываться, вы можете использовать один и тот же итератор для обоих циклов.
def myFunctionForSublists(data, startSequence, endSequence):
positions = iter(range(len(data)))
for start in positions:
if data[start:start+len(startSequence)] == startSequence:
for end in positions:
if data[end:end+len(endSequence)] == endSequence:
yield data[start:end+len(endSequence)]
break
Таким образом, цикл start
будет продолжаться, когда петля end
будет оставаться. Если они могут перекрывать , используйте два отдельных итератора для цикла, то есть for start in range(len(data)):
и for end in range(start+1, len(data)):
inttypes
красная сельдь, вы получаете то же предупреждение от myPrintf("%lld", 1LL);
. Он предупреждает об использовании ll
, который в вашей программе (правильно) доставляется макросом inttypes.
Это похмелье от более старых версий MinGW, где форматирование printf было перенаправлено через MSVCRT, который не обрабатывал %lld
, поэтому было уместно предупредить.
Вы можете решить проблему, добавив новую верхнюю строку в файл (до включения любого стандарта):
#define __USE_MINGW_ANSI_STDIO 1
и затем используя следующий атрибут:
__attribute__((format(__MINGW_PRINTF_FORMAT, 1, 2)))
static void myPrintf(const char* fmt, ...)
[ 1115] Это инструктирует mingw-w64 использовать собственную реализацию printf, которая соответствует стандартам ISO, и соответственно получать -Wformat
предупреждений. Ссылка на документацию
В моей системе (g ++ 8.2.1) использование %lld
и т. Д. На самом деле работает правильно даже без первой строки, поэтому я подозреваю, что они могут иметь по умолчанию исправлено использование ISO stdio вместо MS stdio. Или, возможно, теперь MS stdio знает о %lld
.
Возможно, стоит сообщить об ошибке, чтобы указать, что __attribute__((format(printf
должен автоматически работать должным образом в зависимости от используемого stdio, без необходимости делать этот обходной путь.