我有一个存储了20个名字的文本文件(虽然实际上它将超过20个)
每个名称都存储在单独的行中,例如
Joe
Bob
James
Hannah
Ella
我希望我的脚本将每个名称与另一个名称配对。
练习的目的是让人们在击剑时练习比赛,以便完全随机。
输出应写入脚本末尾的另一个文件,例如。包含10对名称的文本文件。
我是python的新手,并且从未以这种方式使用它。
到目前为止,我正在考虑使用
存储名称列表with open(names.txt) as f:
names = f.readlines()
之后我希望最好的方法是使用
迭代这些行for name in names:
然而,在那之后我感到难过。我知道此时我有一个名称列表中的一个名称,它将用于for
循环的其余部分,然后在重复时使用第二个名称。但是我无法弄清楚如何将名称与列表中的另一个随机名称相匹配。
我可以从最后一行开始向后迭代,但这不是随机的,只是匹配第一个到最后一个,然后是第二个到倒数第二个等。
如何随机配对?
答案 0 :(得分: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)
答案 1 :(得分: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
答案 2 :(得分: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