Получать число символов совместно между двумя цепями текста в Пайтоне

Я пробую решать, используя только основные элементы функций, также как и condicionales и loops, следующее: Получать, между двумя цепями текста, полное число букв, которые они есть общим, считая, что каждая буква совместно считает только как одна. А именно, если у меня есть "собака" и "одежда", результата должно бы быть 3. (p, r, o).

Думая о проблеме, я интуитивно чувствую, что к нему должны приступать используя двойную порцию for и потом сравнивая, если каждый элемент цепи A равен каждому элементу цепи B, мы складываем количество равных элементов и у нас есть результат.

Так, первое, что пришло в голову мне, было это:

def stringc(s1, s2):
    count=0
    for s in s1:
        for t in s2:
            if s==t:
                count+=1
                return count


stringc("perro", "ropa")

##Salida
1

Поскольку он может быть оцененным, будь отдален от того, что я ищу. Итак, используя print вместо return (хотя return это то, что должно быть использованным), я получаю вывод, немного более близкий к тому, что я ищу, хотя печатается список чисел 1 в 4. В принципе, числа, накопленного для примера должно бы быть 3, и только мне интересно получать вышеупомянутое число.

def stringc(s1, s2):
    count=0
    for s in s1:
        for t in s2:
            if s==t:
                count+=1
                print(count)

##Las siguientes son cadenas de prueba:

stringc("perro", "ropa")

##Salida:

1
2
3
4

Хотя я думаю, что моя интуиция правильна, я благодарен сообщите мне мои ошибки логики и программирования. (Глаз: Они не должны быть использованными ни append даже не другие методы. Давайте говорить, что интересное проблемы состоит в том, чтобы добиваться желаемого с программными средствами больше зачаточные Python)

0
задан 14.11.2018, 23:23
2 ответа

Как он комментировал тебе, что лучшее состоит в том, чтобы использовать словарь, но, как ты сказал мне, что podГ, - чтобы использовать, возможно создавать одну funciГіn, чтобы уменьшать string. funciГіn reducirString он удаляет повторенные символы и потом, если возможно применять то, что уже у тебя было.

def reducirString(texto):
    textoReducido = ""
    for letra in texto:
        if letra not in textoReducido:
            textoReducido += letra

    return textoReducido

def stringc(s1, s2):
    count=0
    s1 = reducirString(s1)
    s3 = reducirString(s2)
    for s in s1:
        for t in s2:
            if s==t:
                count+=1

    return count

Надеялся, что оно ты функционирует.

2
ответ дан 20.11.2019, 03:27
  • 1
    Превосходный solució n. Я оцениваю много твое время :) –  Alejandro Carrera 15.11.2018, 00:10

Отвечая по частям

Ошибку lГіgica в тебе cГіdigo

Оставляя в стороне, что не estГЎs считая aГєn тему повторенных букв, главная ошибка состоит в том, чтобы помещать return внутри цикла.

, Когда одна funciГіn достигает одной instrucciГіn return count, оставляет Ваш ejecuciГіn и возвращает стоимость, у которой есть переменная count в этом моменте . Так как ты точно только что увеличил ее, valdrГЎ 1.

Очевидно она soluciГіn состоит в том, чтобы надеяться на то, что цикл заканчивается, и despuГ©s возвращать стоимость переменной, которая уже serГЎ 4.

С другой стороны, так как estГЎs изучая, важно, чтобы с начала ты привык помещать хорошие имена для функций и их parГЎmetros, так что они были автообъяснительными. Иначе читать cГіdigo требует mГЎs усилия. Другие программисты (и ты будущее я ) ты это agradecerГЎn.

С этими идеями я повторно пишу asГ - ты cГіdigo:

def contar_letras_en_comun(cadena1, cadena2):
    count=0
    for letra1 in cadena1:
        for letra2 in cadena2:
            if letra1==:
                count+=1
    return count

не использовать "передовые" вещи

Оставляя todavГ - в стороны тему ее repeticiГіn букв, прогресс, который немедленно приходит в голову мне после того, как видит cГіdigo предыдущий, состоит в том, чтобы удалять внутренний цикл используя ее expresiГіn python subcadena in cadena, которые возвращают тебе True, если subcadena он появляется внутри cadena. Не sГ©, если ты считаешь эту expresiГіn python "передовой", но я это considerarГ - в достаточно bГЎsico.

Используя это:

def contar_letras_en_comun(cadena1, cadena2):
    count=0
    for letra in cadena1:
        if letra in cadena2:
            count+=1
    return count

не только оставляет cГіdigo mГЎs коротко, но tambiГ©n serГЎ mГЎs rГЎpida Ваш ejecuciГіn, так как циклы python должны быть интерпретированы instrucciГіn в instrucciГіn, в то время как она operaciГіn in, хотя, в конце концов чтобы вычислять python usarГЎ tambiГ©n циклы, эти циклы не инструкции python, а инструкции mГЎquina внутри самого intГ©rprete, что был запрограммирован в C, и следовательно mГЎs rГЎpidas.

Как bonus, внизу моя точка зрения остается mГЎs читабельно.

Удалять дублированные буквы

, Чтобы избегать считать букву два раза не остается mГЎs средство защиты, которое приносить реестр quГ© буквы ты считал уже. Форма tГ-шифрует serГ, - чтобы использовать словарь, но возможно считай это "передовым", asГ - что мы это попробуем другой формы.

Другая форма serГ, - чтобы создавать список, чтобы помещать в нее буквы, которые уже мы увидели, и sГіlo мы считаем новые буквы, которые не были уже в этом другом списке. К несчастью это подразумевает, что список должен начинаться vacГ - в и расти. В изложении explГ-citamente decГ-эксперт, что не podГ, - чтобы использовать .append(), с которым эта soluciГіn tambiГ©n остается снаружи.

В самом деле, с такими требовательными ограничениями (отсутствие структур данных dinГЎmicas, а именно, что смогли увеличиваться Ваш tamaГ±o), почти невозможно решать проблему, кроме того, что он сделает ловушку.

Ловушка, которую я сделаю, состоит в том, чтобы иметь вспомогательную цепь, в которую помещении букв, которые уже мы увидели. Для aГ±adir новая буква harГ©: auxiliar = auxiliar + letra, что в фоне жульнический способ делать один append(). Ну, в строгости не, потому что append() изменяет список, в то время как concatenaciГіn цепей он будет верить в новую цепь (и он повторно распределяет ее в ту же переменную) каждый раз. Но результат - тот же самый.

С этой идеей quedarГЎ asГ-:

def contar_letras_en_comun(cadena1, cadena2):
    letras_ya_vistas = ""
    count=0
    for letra in cadena1:
        if (letra not in letras_ya_vistas) and (letra in cadena2):
           count+=1
        letras_ya_vistas += letra
    return count

SoluciГіn pythГіnica

, Хотя это будет засолено того, что ты спрашивал, я не могу прекращать писать tambiГ©n cuГЎl serГ - в форму mГЎs "pythГіnica" делания этого. Это прилагательное (pythГіnico) используется, чтобы относиться в caracterГ-sticas свойственные языку (не обязательно продвинутые, а tГ-копья python и несуществующие в других языках как C), что позволяют писать один cГіdigo много mГЎs элегантно, fГЎcil чтения и mГЎs работоспособно во время того, чтобы работать.

В этом случае, quiz ее cuestiГіn estГЎ в использовании наборов. Соединенный тип данных automГЎticamente решает проблему повторений (так как в наборе каждый элемент сохраняет единственный раз) и ademГЎs у него есть она operaciГіn intersecciГіn, что служит для того, чтобы найти общие буквы.

Она soluciГіn serГ - в сейчас много mГЎs простой, и не tendrГ - в циклы:

def contar_letras_en_comun(cadena1, cadena2):
    letras_en_cadena1 = set(cadena1)
    letras_en_cadena2 = set(cadena2)
    letras_en_comun = letras_en_cadena1.intersection(letras_en_cadena2)
    return (len(letras_en_comun))

Естественно это podrГ, - чтобы считаться "аванпостом" и он вытекает из цели твоего вопроса, но - горе не использовать, что язык дает тебе.

2
ответ дан 20.11.2019, 03:27
  • 1
    Я это делаю así потому что, хотя я знаю какие-то темы промежутки времени - аванпосты в Пайтоне, я стараюсь вновь проходить с нуля, так как я немного " oxidado". Muchí пропасти спасибо за твой ответ. –  Alejandro Carrera 15.11.2018, 16:15

Теги

Похожие вопросы