2016-02-24 2 views
-1

Напишите функцию с именем single_insert_or_delete, который принимает две строки в качестве входных аргументов и возвращает:Одна буква вставки или удаления функции

0, если две строки совпадают точно. 1 если первая строка может стать такой же, как вторая строка, вставив или удалив один символ. Обратите внимание, что вставка и удаление символа не совпадает с заменой символа. 2 иначе

Problem statement

вот что я достиг до сих пор

def single_insert_or_delete (word1,word2): 
    word1=word1.lower() 
    word2=word2.lower() 
    limit=min(len(word1),len(word2)) 
    list1=[] 
    list2=[] 
    common=[] 
    if word1==word2: 
     return 0 
    for i in range(0,len(word1)): 
     list1.append(word1[i]) 
    for k in range(0,len(word2)): 
     list2.append(word2[k]) 
    if abs(len(word1)-len(word2))==1: 
     for c in range(0,limit+1): 
      if list1[c]==list2[c] or list1[c]==list2[c+1] or list1[c+1]==list2[c]: 
       return 1 
      else: 
       return 2 
    else: 
     return 2 

Это на самом деле работает хорошо, но если вы пробовали хитрые слова, как «тем» и «что» это даст 1 вместо 2 что неверно

+2

Что вы пытаетесь сделать? Пожалуйста, отредактируйте свой вопрос и опишите свой problam * как текст *. Изображение не является приемлемым в качестве вопроса. –

+0

можете ли вы разместить некоторые тестовые примеры для этого метода; я с трудом пытаюсь понять, чего вы пытаетесь достичь. – Pandrei

+0

oh, нажмите на кнопку frist, линия синего цвета, чтобы открыть изображение проблемы. –

ответ

0

Возможно, вам придется вернуться за пределы цикла for и перепроверять логику сравнения в if.

для с в диапазоне (0, предел + 1):

 if (list1[c]==list2[c] or list1[c]==list2[c+1] or list1[c+1]==list2[c]): 
       return 1 

Проблемы здесь, когда слова (то и это) сравнивается, он удовлетворяет первое условие т равна т и он переходит в условие if, где он возвращает 1 и выходит из функции. Он не будет продолжать цикл for.

Если вы хотите нечто подобное, а не difflib, вы также можете использовать следующий код.

import numpy 


def single_insert_or_delete(s1,s2): 

    s1 = s1.lower() 
    s2 = s2.lower() 

    l1 = [i for i in s1] # convert the string into an array 
    l2 = [j for j in s2] # convert the second string in an array 

    if s1 == s2: 
     flag = 0 

    elif abs(len(s1)-len(s2)) == 1: 
     if len(l2) > len(l1): 
      l1,l2 = l2,l1 
     l3 = list(numpy.in1d(l1,l2)) 
    # This will compare the elements of 2 arrays and return bool values based on the match 

     if l3.count(False) > 1: # count the number of false values 
      flag = 2 
     else: 
      flag = 1 
    else: 
     flag = 2 

    return flag 


print "Output-1 ", single_insert_or_delete("book","boot") 
print "Output-2 ", single_insert_or_delete("Java","Python") 
print "Output-3 ", single_insert_or_delete("dog","Dog") 
print "Output-4 ", single_insert_or_delete("sin","sink") 
print "Output-5 ", single_insert_or_delete("programming","programing") 

Выход:

C: \ python27 \ python.exe D: /Python/Mylist.py

Выход-1 2

Выход 2-2

Выходной -3 0

Выход-4 1

Выход-5 1

Процесс закончил с кодом выхода 0

+0

мммм, да, вы абсолютно правы, поэтому мой алгоритм нуждается в исправлении спасибо alot bro :) –

+0

Что такое исправление? –

+0

Я думал, что вы просто ищете проблему. Если бы я был вами, я бы определенно использовал difflib так же, как это предложил @mhawke. Это довольно просто и выполняет работу с минимальным loc. – DineshKumar

1

Я не уверен, если вы хотите работать как сделать это, или просто хотите ли вы ее решить, но если Последнее можно использовать difflib.ndiff():

from difflib import ndiff 

def single_insert_or_delete(word1, word2): 
    change_count = sum(1 for s in ndiff(word1.lower(), word2.lower()) if (s[0] == '-' or s[0] == '+')) 
    if change_count > 1: 
     return 2 
    return change_count 

word_pairs = [('Python', 'Java'), ('book', 'boot'), ('sin', 'sink'), ('dog', 'Dog'), ('poke', 'spoke'), ('poker', 'poke'), ('programing', 'programming')] 

for pair in word_pairs: 
    print('{}: {}'.format(single_insert_or_delete(*pair), pair)) 

Выход

 
2: ('Python', 'Java') 
2: ('book', 'boot') 
1: ('sin', 'sink') 
0: ('dog', 'Dog') 
1: ('poke', 'spoke') 
1: ('poker', 'poke') 
1: ('programing', 'programming') 
+0

OMG, На самом деле я начинающий, я только начал изучать эту пару недель назад, поэтому я не знаком с пакетом difflib, но вы определенно прибили его :) Я просто хотел знать, что случилось с моим algorithem –

+0

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

+0

спасибо, что вы самые лучшие :) –