views:

224

answers:

3
def remove_duplicates(strng):
    """
    Returns a string which is the same as the argument except only the
    first occurrence of each letter is present.  Upper and lower case
    letters are treated as different.  Only duplicate letters are removed,
    other characters such as spaces or numbers are not changed. 

    >>> remove_duplicates('apple')
    'aple'
    >>> remove_duplicates('Mississippi')
    'Misp'
    >>> remove_duplicates('The quick brown fox jumps over the lazy dog')
    'The quick brown fx jmps v t lazy dg'
    >>> remove_duplicates('121 balloons 2 u')
    '121 balons 2 u'
    """
    s = strng.split()
    return strng.replace(s[0],"")

Writing a function to get rid of duplicate letters but so far have been playing around for an hour and can't get anything. Help would be appreciated, thanks.

+2  A: 

Not the most efficient, but the most straightforward way is:

>>> s = 'The quick brown fox jumps over the lazy dog'
>>> import string
>>> n = ''
>>> for i in s:
        if i not in string.ascii_letters:
            n += i
        elif i not in n:
            n += i


>>> n
'The quick brown fx jmps v t lazy dg'
SilentGhost
A: 

try this ...

def remove_duplicates(s):
    result = ""
    dic = {}
    for i in s:
        if i not in dic:
            result+=i
            if ord(i.lower()) >= ord('a') and ord(i.lower()) <= ord('z'):
                dic[i] = 1
    return result
Ahmed Kotb
to check whether value is `None`, you should use identity check: `is None`, not equality check (`== None`).
SilentGhost
Use a set instead of a dict - that is what they are for.
Dave Kirby
@SilentGhost, more to the point, use `i in dic` rather than checking the return value of `.get` to figure out if something's in a dict.
Mike Graham
@Dave Set does not guarantee that the ordering is maintained. Further, a whitespace will only be counted once; the OP clearly wanted whitespace to be treated differently.
Santa
@santa dicts do not guarantee ordering either - this is irrelevant. Using a dict and only testing for the presence or absence of keys is conceptually identical to using a set.
Dave Kirby
but isn't searching in dict faster ? assuming that the probability of collision is small ...how does the search in a set works ?
Ahmed Kotb
+2  A: 

Using a list comprehension :

>>> from string import whitespace, digits
>>> s = 'The quick brown fox jumps over the lazy dog'
>>> ''.join([c for i, c in enumerate(s) if c in whitespace+digits \
                                                      or not c in s[:i]])
stanlekub
Nice. I think you should change `if c in whitespace+digits` to `if c not in letters` (and thus, `from string import letters`): your solution would turn `"++"` into `"+"` and I don't think that qualifies as a letter.
badp
Why not, the question does not talk about punctuation. In fact, I used this solution instead of string.ascii_letters (as proposed by SilentGhost) to be able to handle non-ascii characters.I think the better would be whitespace+digits+punctuation... but, the question lacks precisions :)
stanlekub