2014-11-08 4 views
0

Мой кодКак сделать мой код для шифрования python более эффективным?

from itertools import permutations 

original = str(input('What word would you like to unscramble?: ')) 

gen = [] 
for bob in permutations(original): 
    gen.append(''.join(bob)) 



inputFile = open('dic.txt', 'r') 
compare = inputFile.read().split('\n') 
inputFile.close() 

rondo = set(john for john in gen if john in compare) 

for magic in rondo: 
    print(magic) 

Я использую его расшифровывать слова, находя все возможные перестановки слова и сравнения каждой перестановки в словарь, чтобы найти реальные слова, а затем возвращаются те реальные слова. Тем не менее, переборка из восьми букв вызывает ошибку, когда я заканчиваю барабан до завершения программы, и слова с семью или восемью буквами занимают много времени, чтобы отменить разборку. Я хотел бы знать, есть ли способ заставить мой код работать быстрее с более длинными словами, а также способ увеличить максимальную длину слова. Я использую Python 3 и немного начинаю, если это имеет значение.

ответ

2

Вместо добавления всех перестановок в список вы должны просто перебирать их напрямую.

set(''.join(john) for john in permutations(original) if ''.join(john) in compare) 

или

set(john for john in (''.join(bob) for bob in permutations(original)) if john in compare) 

Лучший способ найти решение было бы создать подпись слова либо путем создания карты из письма подсчитывать или путем сортировки писем. Тогда вам нужно будет только сравнить подпись скремблированного слова с подписями из списка слов.

words = {} 
for word in compare: 
    key = ''.join(sorted(word)) 
    if key in words: 
     words[key].add(word) 
    else: 
     words[key] = {word} 

return words[''.join(sorted(original))] 
+0

Спасибо! Я понимаю, о чем вы говорите, но не могли бы вы дать мне демонстрацию, поскольку я не совсем уверен, как это сделать. – TimeWillTell

+1

Вы можете сделать подпись, отсортировав буквы следующим образом. Сканируйте текущий файл словаря, который имеет по одному слову в строке и создайте новый файл с двумя словами в каждой строке: оригинальное слово с буквами, отсортированными в алфавитном порядке, а затем оригинальное слово. Затем, чтобы развернуть слово, вы просто сортируете его и ищите отсортированную версию в новом файле. Возможно, вы сможете хранить новый список двойных слов в памяти как «dict» Python с отсортированным словом в качестве ключа и исходной версии в качестве значения. Если нет, вы можете быстро выполнить поиск по отсортированному файлу с использованием бисекции. –

+0

Это хорошо, но я бы по-прежнему рекомендовал, чтобы задающий вопрос понял и использовал генераторы в коде, согласно моему ответу. –

1

Вы можете использовать генератор вместо списка:

gen = (''.join(bob) for bob in permutations(original)) 

Это позволит сэкономить использование памяти.

Там хорошая дискуссия об использовании генераторов по сравнению с списковых здесь: Generator Expressions vs. List Comprehension

Там также другое хорошее обсуждение здесь: Understanding Generators in Python

Смежные вопросы