Я пытаюсь сопоставить ключи словаря со значениями, основанными на некоторых правилах, без использования дополнительных библиотек. - PullRequest
0 голосов
/ 12 декабря 2018

Ключ dict_ содержит правильное написание, а соответствующее ему значение содержит написание кандидата

Функция должна определять степень правильности, как указано ниже:

ИСПРАВИТЬ , если оно точно соответствует

ПОЧТИ ПРАВИЛЬНО , если не более 2 неправильных букв

НЕПРАВИЛЬНО , если более 2 буквневерно или если длина (правильное написание и правописание, данное участником) не совпадает.

и возвращает список, содержащий количество ПРАВИЛЬНЫХ ответов, количество ПОЧТИ ПРАВИЛЬНЫХ ответов и количество НЕПРАВИЛЬНЫХ

Моя программа предполагаетчто все слова в верхнем регистре и максимальная длина слова составляет 10

Вот мой код:

def find_correct(word_dict):
#start writing your code here
    correct_count=0
    almost_correct_count=0
    incorrect_count=0

    for k,v in word_dict.items():
        if len(k)<=10:
            if len(k)==len(v):
                if k==v:
                    correct_count+=1
                else:
                    for i in k:
                        i_count=0
                        #print(i)
                        for j in v:
                            #print(j)
                            if not i==j:
                               i_count+=1 
                               break
                    if i_count<=2:
                        almost_correct_count+=i_count
                    else:
                        incorrect_count+=i_count

            else:
                incorrect_count+=1
        else:
            incorrect_count+=1
    print(correct_count,almost_correct_count,incorrect_count)

Код драйвера:

word_dict={"WhIZZY":"MIZZLY","PRETTY":"PRESEN"}
print(find_correct(word_dict))

Мой вывод: 0,2,0

Ожидаемый результат: 0,0,2

Ответы [ 4 ]

0 голосов
/ 21 августа 2019
    def find_correct(word_dict):
    correct=0
    almost_correct=0
    wrong=0
    for key,val in word_dict.items():
        key1=key;val1=val
        if(len(key)!=len(val)):
            wrong+=1
        elif(key==val):
            correct+=1
        else:
            var=0;count=0
            for i in range(len(key1)):
                for j in range(i+1):
                    var=j
                if(key1[i]!=val1[j]):
                    count+=1
            if(count<=2):
                almost_correct+=1
            else:
                wrong+=1
    li=[correct,almost_correct,wrong]
    return li
word_dict={"THEIR": "THEIR","BUSINESS":"BISINESS","WINDOWS":"WINDMILL","WERE":"WEAR","SAMPLE":"SAMPLE"}
print(find_correct(word_dict))
0 голосов
/ 13 декабря 2018

Похоже, что это работает для указанных вами словарей, хотя может быть один или два крайних случая, для которых он не работает должным образом.Если у вас есть какие-либо случаи, для которых это не работает, проблема, скорее всего, связана с блоком if/elif/else в функции find_correct и с тем, как он оценивает длину списка.

Я взял реплику из принятого ответа, чтобы преобразовать строки в списки, хотя вместо set ting я использовал метод pop, чтобы удалить обязательные элементы, чтобы учесть дубликаты.

WORD_DICT = {"THEIR":"THEIR",
             "BUSINESS":"BISINESS",
             "WINDOWS":"WINDMILL",
             "WERE":"WEAR",
             "SAMPLE":"SAMPLE"}

second_dict = {'WHIZZY': 'MIZZLY', 'PRETTY': 'PRESEN'}

def find_correct(k, v):

    k, v = list(k), list(v)
    for k_letter in k:
        if k_letter in v:
            idx = v.index(k_letter)
            v.pop(idx)
    if len(v) == 0:
        return "correct"
    elif len(v) == 1:
        return "almost correct"
    else:
        return "incorrect"

def top_level_func(word_dict):

    d = {"correct":0, "almost correct":0, "incorrect":0}
    for k, v in word_dict.items():
        response = find_correct(k, v)
        d[response] += 1

    return d

results = top_level_func(second_dict)
for item in results.items():
    print("{} = {} instances".format(*item))
0 голосов
/ 31 мая 2019
def find_correct(word_dict):
    correct,almost,incorrect=0,0,0
    for key,value in word_dict.items():
        count=0
        if(key==value):
            correct+=1
        elif(len(key)==len(value)):
            for i in range(0,len(key)):
                if(key[i]!=value[i]):
                    count+=1
            if(count<=2):
                almost+=1
            else:
                incorrect+=1
        else:
            incorrect+=1
    list=[correct,almost,incorrect]
    return list 

    word_dict={'WHIZZY': 'MIZZLY', 'PRETTY': 'PRESEN'}
    print(find_correct(word_dict))
0 голосов
/ 12 декабря 2018

Итак, я придумал гораздо более простое решение.Надеюсь, я правильно понял ваш вопрос, но он дает желаемый результат.

WORD_DICT = {"THEIR":"THEIR",
             "BUSINESS":"BISINESS",
             "WINDOWS":"WINDMILL",
             "WERE":"WEAR",
             "SAMPLE":"SAMPLE"}

def find_correct(word_dict):

    correct, almost_correct, incorrect = 0, 0, 0

    for key, value in WORD_DICT.items():

        diff_list = set(list(key)).symmetric_difference(set(list(value)))  
        diff = len(diff_list)

        if diff == 0:
            correct += 1
        elif diff <= 2:
            almost_correct += 1
        elif diff > 2:
            incorrect += 1


    print(correct, almost_correct, incorrect)


find_correct(WORD_DICT)

Вместо того, чтобы просматривать каждый символ, я сравниваю строки как списки.Я получил идею от следующего поста .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...