You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

方法二:修复原代码的逻辑错误

如果要保留原有的随机数生成方式,需解决以下问题:

  1. 变量名错误:clave→keys,TOKNES→TOKENS,key→keys
  2. 循环逻辑:改为直到字典长度达到7才停止循环,而非固定循环7次
  3. 冗余遍历:直接通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:01:06