2015-09-15 2 views
-1

Я пытаюсь играть словами. Например, я прочитал слово «скрипт» из txt-файла. Затем хотелось бы сделать все мутации букв и написать каждый из них. Так вот измененияКак сделать мутацию со словом в python?

s=$ 
s=5 
s=S 
s=s 
c=(
c=[ 
c={ 
c=< 
c=c 
c=C 
r=r 
r=R 
i=i 
i=I 
i=| 
i=1 
i=! 
. 
. 
. 

Что я имел в виду, чтобы получить это

scrypt 
$crypt 
5cript 
Scrypt 
s(ript 
$(cript 
. 
. 
. 

Таким образом, все возможные комбинации. Как и itertool.product Я немного смущен, как это сделать. Я начал вот так:

def main(): 

    with open('file1.txt', 'r') as f1, open('file2.txt', 'w') as f2: 
     for word in f1: 
      l=len(word) 
      for i in range(l): 
       if word[i] = s: 
        word1=word[i].raplace("$") #don't know if sintacs is ok 
        f2.write(word1) 
       else: 
        if word[i] = c: 
       . 
       . 

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

Возможно, мне понадобится много циклов внутри цикла. Я думаю, сколько персонажей в слове это то, как manu для циклов.


Сво сложным и, вероятно, замедлится. Есть ли простой способ? Некоторая функция (инструмент) для импорта?

Вопрос в том, как иметь дело с в том же письме в одном слове и как т

P.S Я использую Python 3.4.2

ответ

1

Построить словарь, который отображает каждую букву в его разрешенных замен. Затем используйте itertools.product, чтобы найти все комбинации этих замен.

import string 
import itertools 

replacements = """ 
s=$ 
s=5 
s=S 
c=(
c=[ 
c={ 
c=< 
c=C 
r=R 
i=I 
i=| 
i=1 
i=! 
""" 


d = {c:[c] for c in string.printable} 
for line in replacements.strip().split("\n"): 
    c, replacement = line.split("=") 
    d[c].append(replacement) 

word = "script" 
for letters in itertools.product(*[d[c] for c in word]): 
    print("".join(letters)) 

Результат:

script 
scrIpt 
scr|pt 
scr1pt 
... 
S(R1pt 
S(R!pt 
S[ript 
S[rIpt 
... 
SCRIpt 
SCR|pt 
SCR1pt 
SCR!pt 
+0

Так что мне нужны replacements.txt и words.txt !! Но что, если words.txt имеет 2 слова? Или я должен положить это после открытия txt-документов? – Difermo

+0

@Difermo Я думаю, что это легко сделать, просто напишите вывод в файл и прочитайте замену из файла. –

+0

Я попробую это и опубликую, если это сработает. Вероятно, это не так, но я учился: D. спасибо – Difermo

0

Ok Я написал код и попробовать его. Первым из них была руна

import string 
import itertools 
def main(): 
     with open('mutation.txt', 'r') as l1, open('replacements.txt', 'r') as l2, open('mutator.txt', 'w') as l3: 
     d = {c:[c] for c in string.printable} 
     for line in replacements.strip().split("\n"): 
      c, replacement = line.split("=") 
      d[c].append(replacement) 

     for word in l1: 
      for letters in itertools.product(*[d[c] for c in word]): 
       l3.write("".join(letters)) 
     print("done") 
if __name__ == "__main__": main() 

И это не сработало. Проблема заключалась в повторном использовании. Он не может читать или должен быть написан по-другому.

Второй раз, когда я попытался поставить замены, как @Kevin. И он работал просто с большим количеством копий (дубликатов). Файл из 38 байт составлял 37,4 МБ. И после удаления дубликатов он снизился до 1,27 МБ. Так много дубликатов. Код, который работал и есть дубликаты был один

import string 
import itertools 
def main(): 
     replacements = """ 
     a=a 
     a=A 
     [email protected] 
     a=4 
     b=b 
     b=B 
     b=6 
     c=c 
     c=C 
     c=< 
     c={ 
     c=[ 
     d=d 
     d=D 
     e=e 
     e=E 
     e=3 
     f=f 
     f=F 
     f=% 
     f=8 
     g=g 
     g=G 
     g=9 
     h=h 
     h=H 
     h=# 
     i=i 
     i=I 
     i=! 
     i=1 
     i=| 
     j=j 
     j=J 
     j=] 
     j=> 
     j=} 
     j=) 
     k=k 
     k=K 
     l=l 
     l=L 
     l=! 
     l=1 
     l=| 
     m=m 
     m=M 
     n=n 
     n=N 
     o=o 
     o=O 
     o=0 
     p=p 
     p=P 
     r=r 
     r=R 
     s=s 
     s=S 
     s=$ 
     s=5 
     t=t 
     t=T 
     t=+ 
     t=7 
     u=u 
     u=U 
     v=v 
     v=V 
     z=z 
     z=Z 
     z=2 
     """ 
     with open('mutation.txt', 'r') as l1, open('replacements.txt', 'r') as l2, open('mutator.txt', 'w') as l3: 
     d = {c:[c] for c in string.printable} 
     for line in replacements.strip().split("\n"): 
      c, replacement = line.split("=") 
      d[c].append(replacement) 

     for word in l1: 
      for letters in itertools.product(*[d[c] for c in word]): 
       l3.write("".join(letters)) 
     print("done") 
if __name__ == "__main__": main() 

Я заметил, что я не использовал l2 после открытой replacements.txt. Поэтому я ставлю этот код

for line in l2.strip().split("\n"): 

запустить его без замен в коде (не @Kevin путь), и это не работало. (это первый код этого 2 я написал). Затем я использую способ @ kevin и помещаю замены внутри кода.

Итак, я в порядке, чтобы поместить замены в код, но как решить дубликаты?