Вы можете использовать re.escape () :
re.escape (string) Возвращаемая строка со всеми неалфавитами обратной косой черты; это полезно, если вы хотите сопоставить произвольную литеральную строку, которая может содержать метасимволы регулярного выражения.
blockquote>>>> import re >>> re.escape('^a.*$') '\\^a\\.\\*\\$'
Просто сделайте график с краями, соединяющими двух человек, если им позволяют совместно использовать подарки и затем использовать идеальный алгоритм соответствия. (Ищите "Пути, Деревья и Цветы" для (умного) алгоритма)
Я просто делал это сам, в конце алгоритм, который я использовал, точно не моделирует вытягивающие имена из шляпы, но это довольно чертовски близко. В основном переставьте список, и затем пару каждый человек со следующим человеком в списке. Единственная разница для вытягивания имен из шляпы - то, что Вы получаете один цикл вместо того, чтобы потенциально получить мини-подгруппы людей, которые только обмениваются подарками друг с другом. Если что-либо, что могло бы быть функцией.
Реализация в Python:
import random
from collections import deque
def pairup(people):
""" Given a list of people, assign each one a secret santa partner
from the list and return the pairings as a dict. Implemented to always
create a perfect cycle"""
random.shuffle(people)
partners = deque(people)
partners.rotate()
return dict(zip(people,partners))
Hmmm. Я взял курс в теории графов, но более простой должен просто случайным образом переставить Ваш список, пара каждая последовательная группа, затем подкачать любой элемент, который запрещен с другим. С тех пор нет никакого запрещенного человека ни в какой данной паре, подкачка будет всегда успешно выполняться, если Вы не позволите подкачки с выбранной группой. Ваш алгоритм слишком сложен.
Я не использовал бы запрещенные соединения, начиная с того значительно увеличения сложность проблемы. Просто введите общее имя и адрес в список. Создайте копию списка и продолжайте переставлять его, пока адреса в каждом положении двух списков не будут соответствовать. Это гарантирует, что никто не вовлекает себя или их супруга.
В качестве награды, если Вы хотите сделать этот стиль тайного голосования, конверты печати из первого списка и имена из второго списка. Не посмотрите при наполнении конвертов. (Или Вы могли просто автоматизировать пользование электронной почтой всем их выбор.)
существует еще больше решений этой проблемы на этот поток .
Я просто создал веб-приложение, которое сделает точно это - http://www.secretsantaswap.com/
, Мой алгоритм допускает подгруппы. Это не симпатично, но это работает.
Работает следующим образом:
1. присвойте уникальный идентификатор всем участникам, помните, какая подгруппа они находятся в
2. дубликат и перестановка, которые перечисляют (цели)
3. создайте массив числа участников каждой подгруппы
4. копируйте массив от [3] для целей
5. создайте новый массив для содержания финальных матчей
6. выполните итерации через участников, присваивающих первую цель, которая не соответствует ни одному из следующих критериев:
A. участник == цель
B. участник. Подгруппа == цель. Подгруппа
C. выбор цели заставит подгруппу перестать работать в будущем (например, подгруппа 1 должна всегда иметь, по крайней мере, столько же неподгруппа 1 цель, остающаяся сколько подгруппа участников 1 участник, остающийся)
D. участник (n+1) == цель (n +1)
, Если мы присваиваем цель мы также, постепенно уменьшает массивы от 3 и 4
Так, не симпатичный (вообще), но это работает. Надежда это помогает,
Dan Carlson