Эксперт в области разработки веб-приложений и безопасности в интернете. Каждый месяц мой блог посещают около 90 тысяч человек. Работаю техническим директором в «Системах документооборота», занимаюсь электронным правительством.
return list(
chain(
*(
[[''], grp][item or len(grp)<3]
for item, grp in (item, list(grp))
for item, grp in groupby(chain(['']*3, letter, ['']*3), lambda x:x))
)
)
)[1:-1]
Заголовок функции я приводить не буду, чтобы не плодить отступы, в функцию входит параметр letter, который содержит обрабатываемый список, возвращается, соответственно, обработанный список. Я постараюсь обойтись без определения генераторов и итераторов, просто представьте, что данные «текут» по функциям, что позволяет их обрабатывать очень экономично, даже если они бесконечные.function uptime() {
$fp=@popen('uptime','r');
$s=@fgets($fp);
@fclose($fp);
@preg_match('#load average: ([0-9\.]+)#', $s, $m);
return $m[1];
};
Во-первых, в PHP есть функция sys_getloadavg, во-вторых, (если версия PHP ниже 5.1.3) эту информацию можно добыть значительно проще: «(float) substr(strstr(`uptime`, "load average:"), 13)», в третих, можно (на Линуксах) читать /proc/loadavg.from itertools import groupby, chain, starmap
def ntrim(letter, n=3, replby=1):
return list(chain(
*starmap(
lambda item, grp: [grp, [''] * replby][item and len(grp)>=n],
((item, list(grp)) for item, grp in
groupby(chain(['']*n, letter, ['']*n), lambda x:x)
)
)
))[replby:-replby]Я модифицировал исходную задачу: последовательности из трёх и более пустых строк заменяются на одну, пустые элементы в начале и конце списка удаляются. И ещё я прибил ленивый триплет из Python 2.5, потому что на домашнем ноуте у меня 2.5, а на рабочем сервере будет 2.4. Надо, кстати, будет посмотреть не цепляется ли он как-то через __future__. Завтра посмотрю, сейчас — спать.
def trim(letter):
SKIPLEAD = object()
SKIPINNE = object()
todelete, stage, skipped = [], SKIPLEAD, 0
for idx, blank in enumerate([x == '' for x in letter]):
if stage == SKIPLEAD:
if blank:
todelete.append(idx)
else:
stage = SKIPINNE
else:
if blank:
skipped += 1
todelete.append(idx)
else:
if 0 < skipped < 3:
todelete = todelete[0:-skipped]
return [letter[idx] for idx in set(range(0, len(letter))) - set(todelete)]
<rss xmlns:ya="http://blogs.yandex.ru/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0">
<ya:more>http://coprophagous.ru/rss/posts/740</ya:more>
Получается много связанных этим тегом документов, в последнем из которых тег «ya:more» отсутствует. Таким образом индексатор поиска по блогам может пройтись по всем постам блога и проиндексировать их. СЕОшники должны оценить.
@ECHO OFF
REM BOLK
REM Вспомогательная процедура для прохождения по массиву
IF NOT "%2"=="" GOTO :LINE
SETLOCAL
REM Входной параметр
SET LINE="%~1"
ECHO In: %LINE%
REM Сюда попадёт результат из ONE
SET OUT=""
REM Переменная останова вспомогательной процедуры
SET LINEBREAK=0
REM Сюда мы поместим результат и выведем его
SET RESULT=
CALL :ONE
REM ECHO Out: %OUT%
REM GOTO :EOF
REM Цикл прохода для DEBUG, который даст нам кучу переменных с шестнадцатеричными
REM значениями в каждой
(ECHO E100 %OUT% 0 && ECHO D100 && ECHO Q) | ^
FOR /F "usebackq tokens=2-15 skip=2 delims=- " %%a IN (`DEBUG`) DO ^
@CALL %0 %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n
GOTO :EOF
: Процедура осторожного разбора входной строки, разбираем так,
: чтобы спецсимволы не попали в код
:ONE
SET L="%LINE:~-2,1%"
REM Это для DEBUG — нужно чтобы заэкранировалась кавычка
IF ^%L:~1,-1%==^" (
SET OUT="""%OUT:~1,-1%
) ELSE (
SET OUT="%L:~1,-1%%OUT:~1,-1%"
)
SET LINE="%LINE:~1,-2%"
IF NOT %LINE%=="" GOTO ONE
GOTO :EOF
: Процедура для прохода по массиву. Так как вызывается через pipe,
: тормозить придётся самостоятельно — родительский процесс ничего отсюда
: не получает
:LINE
IF %LINEBREAK%==1 GOTO :EOF
IF "%1"=="00" (SET LINEBREAK=1 && ECHO %RESULT% && GOTO :EOF)
CALL :CHAR %1
SHIFT
GOTO LINE
: Победа разума над CMD — преобразование hex->dec
:CHAR
SET /A RES=0x%1
IF DEFINED RESULT (SET RESULT=%RESULT% %RES%) ELSE SET RESULT=%RES%