Need help porting Perl function

Sam Denton stdenton at sbcglobal.net
Sat Jun 7 23:11:29 CEST 2008


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]



More information about the Python-list mailing list