<p>一个好的改变是在检查案例时减少<code>appointer</code>的显式性。可以使用<code>name</code>和<code>surname</code>参数动态检查名称。因此,您可以(在<code>appointer</code>内)执行以下操作,而不是为每个名称执行一个<code>if</code>块:</p>
<pre><code>fullname = name + ' ' + surname
</code></pre>
<p>作为跟踪一切的工具,我认为有多种体面的方法可以做到这一点。一种可能是有一本字典,将每个参与者与他们得到的人联系起来。因此,当您分配某人时,您1)从参与者列表中筛选出他们的名字,2)筛选出已经有圣诞老人的人,3)选择一个新名字,4)将连接存储在字典中:</p>
<pre><code>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))
</code></pre>
<p>因此,如果你想任命所有人,你可以:</p>
<pre><code>for i in participants:
name, surname = i.split()
appointer(name, surname)
</code></pre>
<p>然后检查<code>santas</code>之后,查看谁被分配给谁:</p>
<pre><code>{'George Orwell': 'Stevie Nicks',
'Vladimir Nabokov': 'George Orwell',
'Vladimir Sorokin': 'Tom Cruise',
'Mona Lisa': 'Vladimir Sorokin',
'Tom Cruise': 'Mona Lisa',
'Stevie Nicks': 'Vladimir Nabokov'}
</code></pre>
<p>希望这不会太伤你的脚,祝你好运</p>