Сопряжение имени из одного текстового файла со случайным именем из того же текстового файла
У меня есть текстовый файл с 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