Nick Bohl
Nick Bohl

Reputation: 125

replace duplicate values in a list with 'x'?

I am trying to understand the process of creating a function that can replace duplicate strings in a list of strings. for example, I want to convert this list

mylist = ['a', 'b', 'b', 'a', 'c', 'a']

to this

mylist = ['a', 'b', 'x', 'x', 'c', 'x']

initially, I know I need create my function and iterate through the list

def replace(foo):
    newlist= []
    for i in foo:
        if foo[i] == foo[i+1]:
            foo[i].replace('x')
    return foo

However, I know there are two problems with this. the first is that I get an error stating

list indices must be integers or slices, not str

so I believe I should instead be operating on the range of this list, but I'm not sure how to implement it. The other being that this would only help me if the duplicate letter comes directly after my iteration (i).

Unfortunately, that's as far as my understanding of the problem reaches. If anyone can provide some clarification on this procedure for me, I would be very grateful.

Upvotes: 0

Views: 2297

Answers (4)

Adam
Adam

Reputation: 719

The other solutions use indexing, which isn't necessarily required.

Really simply, you could check if the value is in the new list, else you can append x. If you wanted to use a function:

old = ['a', 'b', 'b', 'a', 'c']

def replace_dupes_with_x(l):
    tmp = list()
    for char in l:
        if char in tmp:
            tmp.append('x')
        else:
            tmp.append(char)

    return tmp

new = replace_dupes_with_x(old)

Upvotes: 0

Adnan Mohib
Adnan Mohib

Reputation: 369

Simple Solution.

my_list = ['a', 'b', 'b', 'a', 'c', 'a']
new_list = []

for i in range(len(my_list)):
    if my_list[i] in new_list:
        new_list.append('x')
    else:
        new_list.append(my_list[i])
print(my_list)
print(new_list)

# output
#['a', 'b', 'b', 'a', 'c', 'a']
#['a', 'b', 'x', 'x', 'c', 'x']

Upvotes: 2

Noam Peled
Noam Peled

Reputation: 4622

You can use the following solution:

from collections import defaultdict

mylist = ['a', 'b', 'b', 'a', 'c', 'a']
ret, appear = [], defaultdict(int)
for c in mylist:
     appear[c] += 1
     ret.append(c if appear[c] == 1 else 'x')

Which will give you:

['a', 'b', 'x', 'x', 'c', 'x']

Upvotes: -1

Ben
Ben

Reputation: 6348

Go through the list, and keep track of what you've seen in a set. Replace things you've seen before in the list with 'x':

mylist = ['a', 'b', 'b', 'a', 'c', 'a']

seen = set()
for i, e in enumerate(mylist):
    if e in seen:
        mylist[i] = 'x'
    else:
        seen.add(e)

print(mylist)
# ['a', 'b', 'x', 'x', 'c', 'x']

Upvotes: 2

Related Questions