当前位置: 首页 > 知识库问答 >
问题:

是否有一种方法可以将数组的内容配对,以便以后删除它自己?(秘密圣诞老人计划)

晋鹤轩
2023-03-14

我想做一个秘密圣诞老人节目。理想情况下,程序应该要求至少三个名字,然后程序会询问是否有更多的名字。如果是,打开另一个文本字段并将其添加到名称列表中。如果没有,打破循环,创建一个单独的列表,其中包含名称,打乱第二个名称列表,并将它们与原始列表中的名称配对。

例如,如果John、Elliot、Sarah和Jenny输入了他们的名字,程序将他们的名字打乱,它应该输出这样的内容:

[('John', 'Sarah'), ('Elliot', 'John'), ('Sarah', 'Jenny'), ('Jenny', 'Elliot')]

但我得到的是:

[('John', 'John'), ('Elliot', 'John'), ('Sarah', 'Elliot'), ('Jenny', 'Jenny')]

代码如下:

import sys
import random

names = []

class Santa:
    #The class that takes the values, shuffles them, pairs and then displays them
    def __init__(self, name):
        self.turns = name
        self.people = names
        self.final = []

    def sort_names(self):
        random.shuffle(self.people)
        for name in self.turns:
            pair = (name, random.choice(self.people))
            if pair[0] == [1]:
                pair = (name, random.choice(self.people))

            else:
                self.final.append(pair)

    def print_name(self):
        input("\nNames are ready! Press Enter to show the names.")
        print(self.final)

def main():
    # The function asking for user input
    name = input("\nType in your name. ")
    names.append(name)
    name = input("\nType in the next name. ")
    names.append(name)
    name = input("\nType in the next name. ")
    names.append(name)
    while True:
        next = input("\nIs this everyone? Y/N ")
        if next.upper() == "Y":
            break
        elif next.upper() == "N":
            name = input("\nType in the next name. ")
            names.insert(0, name)
        else:
            print("\nInvalid response, please try again.")
    print(names)
    start = Santa(names)
    start.sort_names()
    start.print_name()
    input("\nRecord these, and press enter to quit.")
    sys.exit()

main()

共有2个答案

麹耘豪
2023-03-14
    for name in self.turns:
        pair = (name, random.choice(self.people)) 

        # you compare against [1] ? That is a list containing a 1 as only thing 
        # and it will never be True unless if you compare string vs. name
        if pair[0] == [1]:
            pair = (name, random.choice(self.people)) 
        else:
            self.final.append(pair)

您可以简化您的循环,并且在配对人员时必须处理奇数/偶数个名称。使用列表切片和压缩使得配对更容易。

例子:

import sys
import random
 
class Santa: 
    def __init__(self, names): 
        self.people = names 

    def shuffle(self):
        random.shuffle(self.people)

        self.final = []

        if len(self.people) < 2:
            print("Sorry, not enough people to gift stuff around")
            return

         # taken from the comment, because superior to what I had originally
         # see edit history for my solution ;o) - this one suggested by @Matthias
         self.final = [(n1, n2) for n1, n2 in zip(names, names[1:] + [names[0]])]
 
    def print_name(self): 
        print(self.final)


name = "dummy"
names = []
while name:
    name = input(f"Whats the {len(names)+1}. name? (Empty to end) ").strip()
    if not name:
        break
    names.append(name)
print(names)
santa = Santa(names)
santa.shuffle()
santa.print_name() 

输出(省略输入输出):

# odd inputs
['Tim', 'John', 'Luise', 'Maria', 'Wasja']
[('Wasja', 'Maria'), ('Maria', 'John'), ('Luise', 'Tim')]

['Tim', 'John', 'Luise', 'Maria', 'Wasja']
[('Maria', 'Wasja'), ('Wasja', 'Tim'), ('John', 'Luise')]

# even inputs
['Tim', 'John', 'Luise', 'Maria']
[('John', 'Tim'), ('Maria', 'Luise')]

['Tim', 'John', 'Luise', 'Maria']
[('Luise', 'Tim'), ('John', 'Maria')]

您可以在此处阅读有关zip和列表切片的更多信息:

  • Python中的Zip列表
邹俊豪
2023-03-14

您不需要整个类来设置这个,我已经尝试清理了一些阅读输入。

import random


names = []
for _ in range(3):
  name = input("\nType in your name. ")
  names.append(name)

while True:
  next = input("\nIs this everyone? Y/N ")
  if next.upper() == "Y":
    break
  elif next.upper() == "N":
    name = input("\nType in the next name. ")
    names.insert(0, name)
  else:
      print("\nInvalid response, please try again.")
print(names)

random.shuffle(names)
pairs = [(first_person, second_person) for first_person, second_person in zip(names, names[1:] + [names[0]])]
print(pairs)
 类似资料:
  • 我们被要求创建一个程序,可以用于游戏"秘密圣诞老人": 这是我开发的程序。到目前为止,如果我输入3个人(例如Bob、Ben、Bill),它将返回“Ben为Bill购买”,而没有人为Ben或Bob购买。我目前正试图让它输出“Bob为Ben买东西,Ben为Bill买东西,Bill为Bob买东西”,但到目前为止还没有成功。如果有人能给我一个提示/设置这个的基础,我将不胜感激。另外,如果我的代码中有任何错

  • 我想用js制作一个小脚本,有一个用户列表,一个用户必须向另一个用户赠送礼物。 通过应用以下约束: > 如果“a”是圣诞老人,给“c”送礼物,那就不能反过来了。所以“c”不可能是“a”的圣诞老人。 它必须同时处理偶数和奇数用户。 在你看来,什么是正确的方法来尽量减少比较的数量,也就是说,加快脚本的速度。 我本来想这样开始,但后来我不知道该怎么做:

  • 问题内容: 我希望用户输入时间,例如12:00,但是我需要弄清楚一些事情,我实在是太可惜了。 我可以将文字限制为5个字符吗? 我可以在代码中嵌入冒号,以便用户无法删除它吗? 最后,我可以接受该代码并验证它只是数字(当然忽略了冒号) 问题答案: 答案是使用JFormattedTextField和MaskFormatter。 例如: Java编译器将要求您在创建MaskFormatter时捕获或抛出P

  • 我决定制作一个程序,根据硬编码限制(例如,某人不能得到他的妻子)生成秘密圣诞老人配对。我的家人都很忙,所以很难组织每个人随机画帽子。 我的程序崩溃seldomly,因为不幸的随机配对使剩余的不合法(然而,我抓住他们在测试脚本部分)。把它想象成一个重新绘制的人。 然而,当我的程序成功时,我知道配对是正确的,而不必亲自查看它们,因为我的程序测试有效性。明天,我将不得不找到一种方法,使用配对从我的电子邮

  • 我正在做一个程序,它将模拟秘密圣诞老人的分类帽。我试图让程序有一个错误陷阱,以防止人们获得自己的名字,但我无法让程序在有人获得自己的名字时选择一个新的名字。我遇到的另一个问题是,程序一直过早退出。 这是我的代码: