Jared Grubb wrote:
That almost works, except that a predicate can have "memory". For example, the predicate could be "extract every other object", which doesn't care about the value of the object (so you cant remove them later based on value!). Or your predicate might be "remove the first 5 objects that are even", which means that the predicate must be run against the list in forward order with only one test per element (like an input/output iterator in C++; running the predicate changes the predicate itself, so you cant run one pass with "pred" and then another pass with "not pred" to get the rest). Example of a case where your proposed solution wouldn't quite work:

class EveryOtherOne:
   def __init__(self):
      self.parity = False
   def __call__(self, obj):
      ret, self.parity = self.parity, not self.parity
      return ret

 >>> pred = EveryOtherOne()
 >>> lst = [1,2,2,1]
 >>> extracted = [ obj for obj in lst if pred(obj) ]
 >>> extracted
[2, 1]
 >>> lst = [ obj for obj in lst if obj not in extracted ]
 >>> lst
[]

On Wed, Apr 23, 2008 at 6:14 PM, Brian <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> wrote:

    On Wed, Apr 23, 2008 at 9:08 PM, Jared Grubb <[EMAIL PROTECTED]
    <mailto:[EMAIL PROTECTED]>> wrote:

        I guess I forgot one requirement: the removed elements need to
be remembered.
        Basically, I have a list of objects in a buffer, one class
        operates on some of the objects, but other classes use others.
        So, a class must extract the ones it can handle, and leave the
rest in the buffer for the other classes to handle.
        I haven't found a function that will both remove objects from a
        list, but save the ones that do get removed.

        Jared

        On 23 Apr 2008, at 10:15, Tim Golden wrote:
        Jared Grubb wrote:
        I want a function that removes values from a list if a
        predicate evaluates to True. The best I could come up with is:

        Have a look at the itertools module, and the ifilter function
        in particular.

        TJG
        --
        http://mail.python.org/mailman/listinfo/python-list


        --
        http://mail.python.org/mailman/listinfo/python-list


    I would do it like this:

    # This takes out the values
    extracted = [ obj for obj in lst if pred(obj) ]
    # This filters out any item that was extracted
    lst = [ obj for obj in list if obj not in extracted ]

So what you are saying is that you want to build *two* lists, one of them the ones for which the predicate is true and the other the rest.

Typical customer, doesn't bother to give us the whole specification until we've started programming!

How about (untested, conditional expression abuse warning):

def stripf(lst, pred):
   tlst = []
   flst = []
   for itm in lst:
     (tlst if pred(itm) else flst).append(itm)
   return tlst, flst

regards
 Steve
--
Steve Holden        +1 571 484 6266   +1 800 494 3119
Holden Web LLC              http://www.holdenweb.com/

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to