Python如何避免字典重复键?随机分配Token问题求助
问题描述
需要实现一个函数,从TOKENS字典中向空字典TOKENS_JP(玩家)和TOKENS_CPU(CPU)分配Token:
- 要求通过随机选取的方式,最终两个字典的长度都达到7
- CPU的Token不能与玩家的重复
当前代码使用random.randint()生成随机索引选取Token,但遇到随机数重复时,因字典键重复无法添加元素,导致最终字典长度不足7。
原代码
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()
当前执行结果
{'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
期望结果
{'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
解决方案
方法一:使用random.sample直接获取不重复元素(推荐)
random.sample可以从序列中一次性选取指定数量的不重复元素,无需手动处理重复问题,代码简洁高效:
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 = {} TOKENS_CPU = {} def distribute(): # 从所有Token键中随机选7个不重复的给玩家 jp_keys = random.sample(L_TOKENS, 7) for key in jp_keys: TOKENS_JP[key] = TOKENS[key] # 从剩下的Token键中选7个给CPU remaining_keys = [key for key in L_TOKENS if key not in TOKENS_JP] cpu_keys = random.sample(remaining_keys, 7) for key in cpu_keys: TOKENS_CPU[key] = TOKENS[key] print(TOKENS_JP) print(len(TOKENS_JP)) print(TOKENS_CPU) print(len(TOKENS_CPU)) distribute()
方法二:修复原代码的逻辑错误
如果要保留原有的随机数生成方式,需解决以下问题:
- 变量名错误:
clave→keys,TOKNES→TOKENS,key→keys - 循环逻辑:改为直到字典长度达到7才停止循环,而非固定循环7次
- 冗余遍历:直接通过
L_TOKENS[r]获取键,无需遍历TOKENS所有键
修复后的代码:
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 = {} TOKENS_CPU = {} def distribute(): # 给玩家分配7个不重复的Token while len(TOKENS_JP) < 7: r = random.randint(0, 27) key = L_TOKENS[r] if key not in TOKENS_JP: TOKENS_JP[key] = TOKENS[key] # 给CPU分配7个不重复且与玩家不重复的Token while len(TOKENS_CPU) < 7: r = random.randint(0, 27) key = L_TOKENS[r] if key not in TOKENS_JP and key not in TOKENS_CPU: TOKENS_CPU[key] = TOKENS[key] print(TOKENS_JP) print(len(TOKENS_JP)) print(TOKENS_CPU) print(len(TOKENS_CPU)) distribute()
内容的提问来源于stack exchange,提问作者IsaacRS
相关产品推荐
相关产品推荐

