无法获得秘密圣诞老人密码来记忆指定的姓名

2024-09-29 21:25:50 发布

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

我是Python的新手,到目前为止,我已经学习了一些基本知识,如数据类型、周期和函数的工作方式。问题是我对数据库一无所知…
我想写一个秘密的圣诞老人密码,为我和我的朋友做一个机器人。这个想法是,在你被邀请加入机器人后,你输入你的名字和姓氏,然后分配给一个人(我需要姓氏部分,因为有些人同名)。之后,需要从初始“目标”列表中删除分配的名称,这样就不会将其分配给其他任何人。 到目前为止,我已经完成了作业部分:

def appointer(name, surname):
template = "You are {}'s Secret Santa, congrats!"
targets = ['George Orwell', 'Vladimir Nabokov', 'Vladimir Sorokin']
        if name == 'George' and surname == 'Orwell':
                    targets.remove('George Orwell')
                    print(template.format(random.choice(targets)))
        elif name == 'Vladimir' and surname == 'Nabokov':
                    targets.remove('Vladimir Nabokov')
                    print(template.format(random.choice(targets)))
        elif name == 'Vladimir' and surname == 'Sorokin':
                    targets.remove('Vladimir Sorokin')
                    print(template.format(random.choice(targets)))
                    print(targets)
        else:
                    print('Wrong name, check again!')

(我需要单独的姓名,我的语言名称中的目标公司名单被拒绝。)
是的,这就是我能走的路
因此,下一步是让机器人记住指定的名称,并将其从“目标”列表中删除,这样当下一个人使用机器人时,他或她就不会得到相同的名称。 我尝试将分配的名称放入单独的列表中,但由于存在多个“如果”循环,因此无法工作。
所以我一直在想,有没有办法不用借助数据库就能完成这件事

这里有一个更新:

通过内置字典记住指定人员的计划不起作用,每次我运行代码时,这个dict都会重置为零。
然后我发现了一个非常有用的搁置模块。 下面是我在Tom的帮助下编写的代码:

import shelve

shelveFile = shelve.open('mydata')

import random

participants = [....]
template = "You're {}'s Secret Santa, congrats!"

def appointer(name, surname):
    fullname = name + ' ' + surname
    if fullname not in participants:
        print("Wrong name, check again!)
        return
    if fullname in shelveFile.keys():
        print("You already have your victim!")
        return
    options = [i for i in participants if i != fullname and i not in shelveFile.values()]
    selection = random.choice(options)
    shelveFile[fullname] = selection
    print(template.format(selection))

if __name__ == '__main__':
    appointer(name = input('Enter your name: ').lower().title(), surname = (input('Enter your surname:').lower().title()))

shelveFile.close()

Shelve模块为您提供了一个内置数据库,每次运行代码时,您仍然可以记住所有指定人员


Tags: andname名称formatif机器人templaterandom
2条回答
currentnonAssigneeslist = list()
allSecretSantaMember = list()


def appointer(firstName, lastName):
    # before assign check no duplicate entries
    if firstName + lastName not in currentnonAssigneeslist:
        currentnonAssigneeslist.append(firstName + lastName)
        randomlyAddSecretSanta(firstName, lastName)


def randomlyAddSecretSanta(firstName, lastName):
    # here should be the logic for assigning secret santa randomly
    currentnonAssigneeslist.remove(firstName + lastName)
    allSecretSantaMember.append(firstName + lastName)
    print(currentnonAssigneeslist)


if __name__ == '__main__':
    appointer("Sata", "x")

一个好的改变是在检查案例时减少appointer的显式性。可以使用namesurname参数动态检查名称。因此,您可以(在appointer内)执行以下操作,而不是为每个名称执行一个if块:

fullname = name + ' ' + surname

作为跟踪一切的工具,我认为有多种体面的方法可以做到这一点。一种可能是有一本字典,将每个参与者与他们得到的人联系起来。因此,当您分配某人时,您1)从参与者列表中筛选出他们的名字,2)筛选出已经有圣诞老人的人,3)选择一个新名字,4)将连接存储在字典中:

participants = ['George Orwell', 'Vladimir Nabokov', 'Vladimir Sorokin',
                'Mona Lisa', 'Tom Cruise', 'Stevie Nicks']
template = "You are {}'s Secret Santa, congrats!"
santas = {}

def appointer(name, surname):
    fullname = name + ' ' + surname
    if fullname not in participants:
        print('Wrong name, check again!')
        return # stop the function
    options = [i for i in participants if i != fullname and i not in santas.values()]
    selection = random.choice(options)
    santas[fullname] = selection
    print(template.format(selection))

因此,如果你想任命所有人,你可以:

for i in participants:
    name, surname = i.split()
    appointer(name, surname)

然后检查santas之后,查看谁被分配给谁:

{'George Orwell': 'Stevie Nicks',
 'Vladimir Nabokov': 'George Orwell',
 'Vladimir Sorokin': 'Tom Cruise',
 'Mona Lisa': 'Vladimir Sorokin',
 'Tom Cruise': 'Mona Lisa',
 'Stevie Nicks': 'Vladimir Nabokov'}

希望这不会太伤你的脚,祝你好运

相关问题 更多 >

    热门问题