Colin J. Williams wrote:
John Salerno wrote:
I posted this code last night in response to another thread, and after I posted it I got to wondering if I had misused the list comprehension. Here's the two examples:

Example 1:
--------------------
def compress(s):
    new = []

    for c in s:
        if c not in new:
            new.append(c)
    return ''.join(new)
----------------------

Example 2:
------------------------
def compress(s):
    new = []
    [new.append(c) for c in s if c not in new]
    return ''.join(new)
--------------------------

In example 1, the intention to make an in-place change is explicit, and it's being used as everyone expects it to be used. In example 2, however, I began to think this might be an abuse of list comprehensions, because I'm not assigning the result to anything (nor am I even using the result in any way).

What does everyone think about this? Should list comprehensions be used this way, or should they only be used to actually create a new list that will then be assigned to a variable/returned/etc.?


Alternative ways of of looking at the problem are:

# compress.py
import sets

def compress(s):
    new = []
    [new.append(c) for c in s if c not in new]
    return ''.join(new)

def compress1(s):
  new= []
  d= dict(zip(s, len(s)*[[]]))
  return d.keys()

def compress2(st):
  s= sets.Set(st)
  return s

if __name__ == "__main__":
s= 'In example 1, the intention to make an in-place change is explicit, and it is'
  print (compress(s))
  print (compress1(s))
  print (compress2(s))

Results:

In exampl1,thiok-cgsd
['a', ' ', 'c', 'e', 'i', 'g', 'I', 'h', 'k', '-', 'm', 'l', 'o', 'n', '1', 'p', 's', 't', 'x', ',', 'd'] Set(['a', ' ', 'c', 'e', 'i', 'g', 'I', 'h', 'k', '-', 'm', 'l', 'o', 'n', '1', 'p', 's', 't', 'x', ',', 'd'])

Colin W.

I should have read all the responses before responding!

Paul McGuire had already suggested a set approach

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

Reply via email to