Сопряжение имени из одного текстового файла со случайным именем из того же текстового файла

У меня есть текстовый файл с 20 именами (хотя на практике это будет более 20)

Каждое имя хранится в отдельной строке, например.

Joe
Bob
James
Hannah
Ella

Я хочу, чтобы мой сценарий связывал каждое из имен с другим именем.

Цель упражнения - объединить людей для тренировочных матчей по фехтованию, чтобы они были абсолютно случайными.

Вывод должен быть записан в другой файл в конце скрипта, например. текстовый файл, содержащий 10 пар имен.

Я новичок в Python и никогда не использовал его таким образом.

Пока я думаю о сохранении списка имен, используя

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

затем после этого я ожидаю, что лучший способ будет перебирать строки, используя

for name in names:

однако после этого я в тупике. Я знаю, что на данный момент у меня есть одно имя из списка имен, и это будет использоваться для остальных for цикл, а затем второе имя будет использоваться при повторении. Однако я не могу понять, как сопоставить имя с другим случайным именем в списке.

Я мог бы просто перебрать в обратном порядке, начиная с последней строки, но это не случайно, а просто сопоставляет первое с последним, а затем второе с предпоследним и т. Д.

Как я могу сделать спаривание случайным?

3 ответа

Решение

Путь 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] те, в четных позициях. Проверьте также документацию для почтового индекса. После этого вы можете перебирать пары и записывать их в файл:

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) 

Использование 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

Использовать 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
Другие вопросы по тегам