Секретный Санта с помощью питона - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь написать код, чтобы выбрать Secret Santas для своих кузенов. Код, который у меня есть, работает только для четного числа людей, но у меня есть нечетное число или двоюродные братья.

import random

def Santa(names, draw):
  matches= []
  while names:
    giver = names.pop() #chooses giver and removes name
    receiver = random.choice(draw) #picks random to receive

    if giver != receiver:
      matches.append([giver, receiver]) #adds pair
      draw.remove(receiver) #removes person from receiving list
    else:
      names.append(giver) #if names are the same, adds name back to list
  return matches

family1=['cousin1', 'cousin2', 'cousin3', 'cousin4']
family2=['cousin5', 'cousin6', 'cousin7','cousin8','cousin9','cousin10']
family3=['cousin11', 'cousin12', 'cousin13','cousin14']
family4=['cousin15', 'cousin16', 'cousin17']
family5=['cousin18', 'cousin19']

names = [ 'cousin1', 'cousin2', 'cousin3', 'cousin4','cousin5']

print(Santa(names,names))

Ошибка IndexError: Невозможно выбрать пустую последовательность из строки:

receiver = random.choice(draw)

Одно из ограничений, которое я добавлю в будущем, заключается в том, что у вас не может быть одного из ваших братьев и сестер или родственников. Любой совет, как сделать эту работу для нечетного списка имен или семейного ограничения, был бы очень полезен.

1 Ответ

0 голосов
/ 07 ноября 2019

Ваша проблема в том, что вы передали один и тот же массив names обоим аргументам. Это может показаться верным, но вы должны помнить, что Python передает аргументы по ссылке, поэтому это не два идентичных объекта, это один и тот же объект. Когда вы вытаскиваете предмет из givers, он также исчезает из draw. Попробуйте следующее:

import random
from copy import copy

def Santa(names, draw):
  matches= []
  while names:
    giver = names.pop() #chooses giver and removes name
    receiver = random.choice(draw) #picks random to receive

    if giver != receiver:
      matches.append([giver, receiver]) #adds pair
      draw.remove(receiver) #removes person from receiving list
    else:
      names.append(giver) #if names are the same, adds name back to list
  return matches

family1=['cousin1', 'cousin2', 'cousin3', 'cousin4']
family2=['cousin5', 'cousin6', 'cousin7','cousin8','cousin9','cousin10']
family3=['cousin11', 'cousin12', 'cousin13','cousin14']
family4=['cousin15', 'cousin16', 'cousin17']
family5=['cousin18', 'cousin19']

names = [ 'cousin1', 'cousin2', 'cousin3', 'cousin4', 'cousin5']

print(Santa(names,copy(names)))

Конечно, вам на самом деле не нужно делать это, когда вы переходите к использованию разных списков для двух аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...