将一个文本文件中的姓名与同一文本文件中的随机姓名配对

-1 投票
3 回答
561 浏览
提问于 2025-04-18 16:31

我有一个文本文件,里面存了20个名字(实际上可能会更多)。

每个名字都在单独的一行,比如:

Joe
Bob
James
Hannah
Ella

我想让我的脚本把每个名字和另一个名字配对。

这个练习的目的是为了给练习击剑的比赛配对,让配对完全随机。

最后,脚本的输出应该写入另一个文件,比如一个包含10对名字的文本文件。

我刚开始学Python,从来没有这样用过。

到目前为止,我想用

with open(names.txt) as f:
    names = f.readlines()

来存储名字的列表,然后我觉得最好的方法是用

for name in names:

来逐行处理这些名字。

但是接下来我就卡住了。我知道此时我有一个名字,接下来会在for循环中用到这个名字,而第二个名字会在循环重复时用到。不过我不知道怎么把这个名字和列表中的另一个随机名字配对。

我可以从最后一行开始反向遍历,但那样就不随机了,只是把第一个名字和最后一个名字配对,第二个和倒数第二个配对,依此类推。

我该怎么才能让配对变得随机呢?

3 个回答

0

使用Random类,具体的说明可以在这里找到:https://docs.python.org/2/library/random.html。如果你想成对地随机获取名字,可以先从列表中随机选一个元素,然后再从(现在变小的)列表中选第二个元素:

while len(names) > 0:
    first = names.pop(random.randint(0, len(names)-1))
    second = names.pop(random.randint(0, len(names)-1))
    # Write those out to your result file in whatever format you want
0

使用 random.shuffle 可以改变名字的顺序:

In [11]: names  = ["Joe","Bob","James","Hannah","Ella"]

In [12]: random.shuffle(names)

In [13]: names
Out[13]: ['Bob', 'Ella', 'James', 'Joe', 'Hannah']

n [21]: import random

In [22]: from itertools import izip

In [23]: names  = ["Joe","Bob","James","Hannah","Ella","Foo"]

In [24]: random.shuffle(names)

In [25]: for name1,name2 in izip(*[iter(names)]*2):
   ....:          print name1,name2
   ....:     
Ella Foo
James Hannah
Joe Bob
1

在Python中,处理这个问题的方式是先把列表打乱,然后从中提取出成对的元素:

from random import shuffle

with open('names.txt', 'r') as f:
    names = [name.strip() for name in f]

shuffle(names)

pairs = zip(names[::2], names[1::2])

names[::2] 代表的是在奇数位置上的名字(从0开始算),而 names[1::2] 则是偶数位置上的名字。你也可以查看一下关于 zip 的文档。接下来,你可以遍历这些成对的元素,并把它们写入文件:

with open('output.txt', 'w') as f:
    for pair in pairs:
        f.write('%s is paired with %s\n' % pair)

更好的方法

虽然这不是你的情况,但如果你想要更快的处理方式,并且不想保存临时结构,你可以使用 from itertools import izip,然后在打乱列表之后:

it = iter(names)
with open('output.txt', 'w') as f:
    for pair in izip(it, it):
        f.write('%s is paired with %s\n' % pair) 

撰写回答