Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

any modules having a function to partition a list by predicate provided?

1 view
Skip to first unread message

knifenomad

unread,
Apr 19, 2010, 9:00:39 PM4/19/10
to
i know it's not very hard to get that solution.
just by implementing simple function like below.

def partition(target, predicate):
"""
split a list into two partitions with a predicate
provided.
any better ideas? :)
"""
true = []
false= []
for item in target:
if predicates(item):
true.append(item)
else:
false.append(item)
return true, false

but i wonder if there's another way to do this with standard libraries
or .. built-ins.
if it's not, i'd like the list objects to have partition method like
string module has.

true, false = [1,2,3,4].partition(lambda x: x >1)

print true, false
[2,3,4] [1]

Chris Rebert

unread,
Apr 19, 2010, 9:16:13 PM4/19/10
to knifenomad, pytho...@python.org
On Mon, Apr 19, 2010 at 6:00 PM, knifenomad <knife...@gmail.com> wrote:
> i know it's not very hard to get that solution.
> just by implementing simple function like below.
>
>      def partition(target, predicate):
>            """
>            split a list into two partitions with a predicate
> provided.
>            any better ideas? :)
>            """
>            true = []
>            false= []
>            for item in target:
>                if predicates(item):
>                    true.append(item)
>                else:
>                    false.append(item)
>            return true, false
>
> but i wonder if there's another way to do this with standard libraries
> or .. built-ins.
> if it's not, i'd like the list objects to have partition method like
> string module has.

(A) str.partition() has a /completely/ different meaning from your partition()
(B) You'd probably have better luck getting it added to the itertools
module since the concept is applicable to all iterables.
[http://docs.python.org/library/itertools.html]

Cheers,
Chris
--
http://blog.rebertia.com

segunai

unread,
Apr 19, 2010, 9:40:26 PM4/19/10
to
On 4월20일, 오전10시16분, Chris Rebert <c...@rebertia.com> wrote:

yep, my mistake. i shouldn't have compared it to string's partition().
i just wanted that convenience string.partition() has as a built-in.
anyway, thanks for itertools. :)

Krister Svanlund

unread,
Apr 20, 2010, 12:29:43 AM4/20/10
to segunai, pytho...@python.org
> --
> http://mail.python.org/mailman/listinfo/python-list
>

The way I would do it is probably apply filter to the list:
>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]

Bryan

unread,
Apr 20, 2010, 4:58:32 AM4/20/10
to
knifenomad wrote:
> i know it's not very hard to get that solution.
> just by implementing simple function like below.
>
>       def partition(target, predicate):
>             """
>             split a list into two partitions with a predicate
> provided.
>             any better ideas? :)
>             """
>             true = []
>             false= []
>             for item in target:
>                 if predicates(item):
>                     true.append(item)
>                 else:
>                     false.append(item)
>             return true, false
>
> but i wonder if there's another way to do this with standard libraries
> or .. built-ins.
> if it's not, i'd like the list objects to have partition method


I've oft collected partitions in a dict, so I'll suggest the
generalization:

def partition(target, predicate):
result = {}
for item in target:
result.setdefault(predicate(item), []).append(item)
return result


> true, false = [1,2,3,4].partition(lambda x: x >1)
>
> print true, false
> [2,3,4] [1]

With my version you'd get:
{False: [1], True: [2, 3, 4]}


--
--Bryan

0 new messages