Как выполнить XOR всех слов в файле
Я хочу преобразовать все слова в стандартном словаре (например: /usr/share/dict/words на машине с Unix) целое и найти XOR между каждыми двумя словами в словаре (конечно, после преобразования их в целое) и, вероятно, сохранить его в новом файле.
Поскольку я новичок в Python и из-за больших размеров файлов, программа время от времени зависает.
import os
dictionary = open("/usr/share/dict/words","r")
'''a = os.path.getsize("/usr/share/dict/words")
c = fo.read(a)'''
words = dictionary.readlines()
foo = open("word_integer.txt", "a")
for word in words:
foo.write(word)
foo.write("\t")
int_word = int(word.encode('hex'), 16)
'''print int_word'''
foo.write(str(int_word))
foo.write("\n")
foo.close()
2 ответа
Во-первых, нам нужен метод для преобразования вашей строки в целое число, я создам его (поскольку то, что вы делаете, вообще не работает для меня, может быть, вы хотите закодировать как unicode?):
def word_to_int(word):
return sum(ord(i) for i in word.strip())
Далее нам нужно обработать файлы. Следующее работает в Python 2.7 и далее (в 2.6 просто вложите два отдельных блока или используйте contextlib.nested
:
with open("/usr/share/dict/words","rU") as dictionary:
with open("word_integer.txt", "a") as foo:
while dictionary:
try:
w1, w2 = next(dictionary), next(dictionary)
foo.write(str(word_to_int(w1) ^ word_to_int(w2)))
except StopIteration:
print("We've run out of words!")
break
Этот код, кажется, работает для меня. Вы, вероятно, столкнулись с проблемами эффективности, потому что вы звоните readlines()
на весь файл, который тянет все это в память сразу.
Это решение перебирает файл строка за строкой для каждой строки и вычисляет xor.
f = open('/usr/share/dict/words', 'r')
pairwise_xors = {}
def str_to_int(w):
return int(w.encode('hex'), 16)
while True:
line1 = f.readline().strip()
g = open('/usr/share/dict/words', 'r')
line2 = g.readline().strip()
if line1 and line2:
pairwise_xors[(line1, line2)] = (str_to_int(line1) ^ str_to_int(line2))
else:
g.close()
break
f.close()