Python - строки из файлов - все комбинации - PullRequest
1 голос
/ 26 апреля 2009

У меня есть два файла - prefix.txt и term.txt, в обоих по 100 строк. Я хотел бы выписать третий файл с декартовым произведением

http://en.wikipedia.org/wiki/Join_(SQL)#Cross_join

- около 10000 строк.

Как лучше всего подойти к этому в Python?

Во-вторых, есть ли способ записать 10000 строк в третий файл в случайном порядке?

Ответы [ 3 ]

4 голосов
/ 26 апреля 2009

Вам нужно itertools.product.

for prefix, term in itertools.product(open('prefix.txt'), open('terms.txt')):
    print(prefix.strip() + term.strip())

Напечатайте их, или накопите их, или напишите их напрямую. Вам нужен .strip() из-за новой строки, которая идет с каждым из них.

После этого вы можете перетасовать их, используя random.shuffle (list (open ('thirdfile.txt')), но я не знаю, насколько быстро это будет для файла используемых вами размеров.

1 голос
/ 26 апреля 2009
from random import shuffle
a = list(open('prefix.txt'))
b = list(open('terms.txt'))
c = [x.strip() + y.strip() for x in a for y in b]
shuffle(c)
open('result.txt', 'w').write('\n'.join(c))

Конечно, не самый лучший способ с точки зрения скорости и памяти, но 10000 недостаточно велик, чтобы жертвовать краткостью в любом случае. Обычно вы должны закрывать свои файловые объекты, и вы можете перебрать хотя бы один из файлов, не сохраняя его содержимое в оперативной памяти. This: [:-1] удаляет завершающий символ новой строки из каждого элемента a и b.

Редактировать: используя s.strip() вместо s[:-1], чтобы избавиться от новых строк - это более переносимо.

1 голос
/ 26 апреля 2009

Декартово произведение перечисляет все комбинации. Самый простой способ перечислить все комбинации - это использовать вложенные циклы.

Вы не можете писать файлы в случайном порядке очень легко. Чтобы написать «случайную» позицию, вы должны использовать file.seek(). Как вы узнаете, какую должность вы будете искать? Как вы узнаете, какой длины будет каждая часть (префикс + термин)?

Однако вы можете прочитать все файлы в память (100 строк - ничто) и обработать коллекции в памяти в «случайном» порядке. Это обеспечит рандомизацию выходных данных.

...