res += [v for v in vals if bool_func(v)]
vals = [v for v in vals if not bool_func(v)]
res += [v for v in vals if bool_func(v)]
vals = [v for v in vals if not bool_func(v)]
tmp = [(v, bool_func(v)) for v in vals]
res += [v[0] for v in tmp if v[1]]
vals = [v[0] for v in tmp if not v[1]]
res += [vals.pop( index ) for index, v in enumerate( reversed( vals ) ) if bool_func(v) ]
tmp = []
for v in vals:
if bool_func(v):
res.append(v)
else:
tmp.append(v)
vals = tmp
IsemК сожалению pop с enumerate совместно отказываются работать.
Можно попробовать так:Правда, операция pop может быть дорогая для больших списков, если извлекаемый элемент находится в начале списка. Однако, вполне возможно, что списки в питоне реализованы как деки, тогда удаление из середины списка наиболее времязатратно.res += [vals.pop( index ) for index, v in enumerate( reversed( vals ) ) if bool_func(v) ]
alexx11Ну, если уж так хочется извращений, то их есть у меня :):
К сожалению pop с enumerate совместно отказываются работать.
vals, res = reduce(lambda x,y:(x[bool_func(y)].append(y),x)[1], vals, [[],[]])
alexx11В виду того, что я не работаю с питоном версии ниже 3 в принципе, возможно это и так.
К сожалению pop с enumerate совместно отказываются работать.
EdЧто касается однопроходного варианта с циклом, то он, очевидно, самый простой и самый верный.
Хмм. Я бы сделал дешево и сердито, зато понятно: