If your concern is not to use two lines of code for an operation whose semantics only need once you just wrap some of the approaches above (even your own) in a single function:
def part_with_predicate(l, pred):
return [i for i in l if pred(i)], [i for i in l if not pred(i)]
It is not a lazy-eval approach and it does iterate twice through the list, but it allows you to partition the list in one line of code.