Ted Idzikowski Ted Idzikowski - 1 month ago 4
Python Question

Erasing pairs of equal ranking in the same list?

I've got a function called erasing_pairs that should take a string as input and return a copy of list l where all the pairs from l are removed and elements of the new list shuffled. The docstrings below explain in more details.

The desired outcome is like below:

>>> erase_pairs(['9♠', '5♠', 'K♢', 'A♣', 'K♣', 'K♡', '2♠', 'Q♠', 'K♠', 'Q♢', 'J♠', 'A♡', '4♣', '5♣', '7♡', 'A♠', '10♣', 'Q♡', '8♡', '9♢', '10♢', 'J♡', '10♡', 'J♣', '3♡'])
['10♣', '2♠', '3♡', '4♣', '7♡', '8♡', 'A♣', 'J♣', 'Q♢']


Here's how the function is expected to look like:

def erase_pairs(l):
without_pairs=[]

random.shuffle(without_pairs)
return without_pairs


So basically, I explained the desired outcome. Here's an attempt I made, but to no avail:

def erase_pairs(l):
without_pairs=[]
without_pairs = [x for x in l if l.count((l[x][0])) == 1]
random.shuffle(without_pairs)
return without_pairs

Answer

I'm going to make one small change to your data, for the sake of convenience. Instead of 10♠, use T♠, This means you can compare the values by looking at the first character.

Return single item lists. Avoid possible index errors later.

if len(l) < 2:
    return l

Sort first. This brings all potential pairs next to each other, for quick removal:

l.sort()
l.append([None]) # This helps check at the end of the list, 
                 # while avoiding accidentally reading beyond the end          
                 # of the list.

Then go through the list in pairs, adding any unpaired items to no_pairs.

no_pairs = []
i = 1
while i < len(l):
    if l[i-1][0] != l[i][0]:
        no_pairs.append(l[i-1])
        i += 1
    else:
        i += 2    

shuffle and return

random.shuffle(no_pairs)
return no_pairs
Comments