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

时间:2014-08-08 09:16:30

标签: python text lines names

我有一个存储了20个名字的文本文件(虽然实际上它将超过20个)

每个名称都存储在单独的行中,例如

Joe
Bob
James
Hannah
Ella

我希望我的脚本将每个名称与另一个名称配对。

练习的目的是让人们在击剑时练习比赛,以便完全随机。

输出应写入脚本末尾的另一个文件,例如。包含10对名称的文本文件。

我是python的新手,并且从未以这种方式使用它。

到目前为止,我正在考虑使用

存储名称列表
with open(names.txt) as f:
    names = f.readlines()

之后我希望最好的方法是使用

迭代这些行
for name in names:
然而,在那之后我感到难过。我知道此时我有一个名称列表中的一个名称,它将用于for循环的其余部分,然后在重复时使用第二个名称。但是我无法弄清楚如何将名称与列表中的另一个随机名称相匹配。

我可以从最后一行开始向后迭代,但这不是随机的,只是匹配第一个到最后一个,然后是第二个到倒数第二个等。

如何随机配对?

3 个答案:

答案 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