如何在Python的dict中检查值是否已经分配给键,反之亦然

2024-09-27 21:22:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试用python编写一个dict,将每个字母(从a到Z)随机分配给另一个(或他自己)。
例如A:S B:C C:B D:D。。。学生:A。。。Y:Z:Y。你知道吗

我的代码是:

import random
tblconex = {}
alphabet = {1: "A", 2: "B", 3: "C", 4: "D", 5: "E", 6: "F", 7: "G", 8: "H", 9: "I", 10: "J", 11: "K", 12: "L", 13: "M", 14: "N", 15: "O", 16: "P", 17: "Q", 18: "R", 19: "S", 20: "T", 21: "U", 22: "V", 23: "W", 24: "X", 25: "Y", 26: "Z"}
while n < 27:
    var = alphabet[random.randint(1, 26)] #We randomly choose a letter
    if var in tblconex or alphabet[n] in tblconex: #We test if she is not already assign to an other
        n += 1
    else:
        tblconex.update({alphabet[n]: var}) #We assign it
        tblconex.update({var: alphabet[n]}) 
    n += 1
z=1
while z<len(tblconex)+1: #We print our letters
    print("    ", alphabet[z], " : ", tblconex[alphabet[z]])
    z += 1

但当我启动它时,他在几个字母后就停了下来,出现了一个关键错误,因为他没有分配所有的字母,我也不明白为什么。你知道吗

对不起,我英语不好,我是法国人;)

谢谢!你知道吗


Tags: 代码inifvar字母updaterandom学生
2条回答

基本问题是,即使已经将元素添加到字典中,也要增加n。因此,如果您已经添加了元素,它仍然将计算为一个元素。如果它是而不是添加的,则算作两个,但是在可能的情况下

无论如何,没有理由这样做,我们可以先通过洗牌字符来创建一个随机字符串,然后将这些字符“缝合”在一起,如:

基本问题是,即使已经将元素添加到字典中,也要增加n。因此,如果您已经添加了元素,它仍然将计算为一个元素。如果它是而不是添加的,则算作两个,但是在可能的情况下

无论如何,没有理由这样做,我们可以先通过洗牌字符来创建一个随机字符串,然后将这些字符“缝合”在一起,如:

from string import ascii_uppercase
from random import shuffle

dt = list(ascii_uppercase)
shuffle(dt)
dt = iter(dt)

result = {k: v for a, b in zip(dt, dt) for k, v in ((a,b), (b, a))}

或者,如果一个字符可以与其自身“配对”,我们可以像这样实现它:

from string import ascii_uppercase
from random import shuffle, randint

dt = list(ascii_uppercase)
shuffle(dt)

result = {}
i = 0
while i < len(dt):
    d = randint(0,len(dt)-i-1 > 0)
    k = dt[i]
    v = dt[i+d]
    result.update({k: v, v: k})
    i += 1 + d

assert len(result) == len(ascii_uppercase)
assert len(set(result.values())) == len(ascii_uppercase)

这两种算法都是在线性时间内工作的,因为它们只对随机字符列表进行一次遍历,每次都将前一个字符与下一个字符(或当前字符与自身)链接起来。你知道吗

您可以使用random.choice从字母表中进行选择,每次删除1个字母:

import random
import string

letters = string.ascii_uppercase
values = dict.fromkeys(letters)
for letter in values:
    choose = random.choice(letters)
    if choose in values.values():
        continue
        # see note **
    letters.remove(choose)
    values[letter] = choose

for k, v in values.items():
    values[v] = k

**检查是否已分配选项,如果已分配,则跳过键并继续。这将确保A映射到B,B映射到A。在结束时,我添加跳过的对,但是交换了键/值

相关问题 更多 >

    热门问题