kj wrote:
Hi.  I'd like to port a Perl function that does something I don't
know how to do in Python.  (In fact, it may even be something that
is distinctly un-Pythonic!)

The original Perl function takes a reference to an array, removes
from this array all the elements that satisfy a particular criterion,
and returns the list consisting of the removed elements.  Hence
this function returns a value *and* has a major side effect, namely
the target array of the original argument will be modified (this
is the part I suspect may be un-Pythonic).

The two solutions thus far use the .index() method, which itself runs in O(n) time. This means that the provided functions run in O(n^2) time, which can be a problem if the list is big. I'd go with this:

def partition(alist, criteria):
    list1, list2 = [], []
    for item in alist:
        if criteria(item):
            list1.append(item)
        else:
            list2.append(item)
    return (list1, list2)

def mod(alist, criteria=lambda x: x % 2 == 0):
    alist[:], blist = partition(alist, criteria)
    return blist


>>> partition(range(10), lambda x: x % 2 == 0)
([0, 2, 4, 6, 8], [1, 3, 5, 7, 9])
>>> l=range(10)
>>> mod(l)
[1, 3, 5, 7, 9]
>>> l
[0, 2, 4, 6, 8]
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to