将一个文本文件中的姓名与同一文本文件中的随机姓名配对
我有一个文本文件,里面存了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)