Python how to avoid a repeated dictionary key

Question:

So, I was trying to make a function to distribute tokens from a dictionary that works as a data base to other blank dictionaries. I use the random.randint() to obtain random tokens out of the big dict and transferred them to the other dict until they are filled with a len(dict) == 7. The problem occurs when the random number generated repeats itself and the dictionary doesn’t add some tokens since its repeating the same key.

I want to know how would you avoid the random number to repeat itself or instead of not adding the element to add the next (key,value).

Import random

L_TOKENS = ["P.0|0","P.0|1","P.0|2", "P.0|3", "P.0|4", "P.0|5", "P.0|6", "P.1|1",
    "P.1|2" , "P.1|3", "P.1|4", "P.1|5", "P.1|6",
    "P.2|2", "P.2|3", "P.2|4", "P.2|5", "P.2|6",
    "P.3|3", "P.3|4", "P.3|5", "P.3|6",
    "P.4|4", "P.4|5", "P.4|6","P.5|5", "P.5|6","P.6|6"
]

TOKENS = {
    "P.0|0": [0,0], "P.0|1": [0,1], "P.0|2": [0,2], "P.0|3": [0,3], "P.0|4": [0,4], "P.0|5": [0,5], "P.0|6": [0,6],
    "P.1|1": [1,1], "P.1|2": [1,2], "P.1|3": [1,3], "P.1|4": [1,4], "P.1|5": [1,5], "P.1|6": [1,6],
    "P.2|2":[2,2], "P.2|3":[2,3], "P.2|4":[2,4], "P.2|5":[2,5], "P.2|6":[2,6],
    "P.3|3":[3,3], "P.3|4":[3,4], "P.3|5":[3,5], "P.3|6":[3,6],
    "P.4|4":[4,4], "P.4|5":[4,5], "P.4|6":[4,6],
    "P.5|5":[5,5], "P.5|6":[5,6],
    "P.6|6":[6,6]
}


TOKENS_JP = {} #Player's tokens
TOKENS_CPU = {} # CPU's tokens



def distribute():
    for j in range(7): #Number of times a player receives a token
        r = random.randint(0,27)
        for keys in TOKENS:
            if L_TOKENS[r] == keys:
                TOKENS_JP[clave] = TOKENS[clave]  #The player receives a token
                   
    for i in range(7):            
        for keys in TOKENS:
            r = random.randint(0,27) 
            if L_TOKENS[r] not in TOKENS_JP:   #The CPU receives a token the player doesn't have.
                if L_TOKENS[r] == keys:
                    TOKENS_CPU[keys] = TOKNES[key]
             
    print(TOKENS_JP)
    print(len(TOKENS_JP))

    print(TOKENS_CPU)
    print(len(TOKENS_CPU))

distribute()

And I get the following result:
{'P.0|3': [0, 3], 'P.3|5': [3, 5], 'P.2|5': [2, 5], 'P.2|6': [2, 6], 'P.2|2': [2, 2], 'P.3|6': [3, 6]}
6
{'P.1|3': [1, 3], 'P.0|6': [0, 6], 'P.0|0': [0, 0], 'P.0|1': [0, 1], 'P.0|5': [0, 5]}
5

But I wish for it to look like this:
{'P.0|3': [0, 3], 'P.3|5': [3, 5], 'P.2|5': [2, 5], 'P.2|6': [2, 6], 'P.2|2': [2, 2], 'P.3|6': [3, 6], 'P.4|4':[4,4]}
7
{'P.1|3': [1, 3], 'P.0|6': [0, 6], 'P.0|0': [0, 0], 'P.0|1': [0, 1], 'P.0|5': [0, 5], 'P.6|6':[6,6], 'P.2|4':[2,4}
7

Asked By: IsaacRS

||

Answers:

To randomly select without repetition, you could instead use random.sample(), which returns n unique elements. We can take all the needed elements with this—7 tokens for the user, plus 7 tokens for the cpu.

Since the results are random, it doesn’t matter the order that they’re selected, so we can take the first 7 tokens for the user and the next 7 tokens for the cpu:

selected_tokens = random.sample(L_TOKENS, 14)

player_tokens = selected_tokens[0:7]
cpu_tokens = selected_tokens[7:14]

Then, for selecting the keys, you can do:

TOKENS_JP = {key: TOKENS[key] for key in player_tokens}
TOKENS_CPU = {key: TOKENS[key] for key in cpu_tokens}
Answered By: Dash
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.