Python. Приклади розв’язку задач на рядки символів. Частина 1




Приклади розв’язку задач на рядки символів. Частина 1

У даній темі наведено приклади розв’язку деяких поширених задач на рядки символів без використання стандартних функцій мови Python.

Перед вивченням даної теми рекомендується ознайомитись з темами:


Зміст


Пошук на інших ресурсах:

1. Рекурсивна функція CountCharacterToString(). Визначення кількості входжень заданого символу в рядку

 

# Рекурсивна функція - повертає кількість входжень
# заданого символу в списку
def CountCharacterToString(c, s):
    if s=="": # умова завершення циклу
      return 0
    else:
      if c==s[0]: # порівняння символу з першим елементом рядка
        return 1 + CountCharacterToString(c, s[1:]) # рекурсивний виклик
      else:
        return CountCharacterToString(c, s[1:])

# Викликати функцію CountCharacterToString()
n = CountCharacterToString('a', "jprstaajklmnabcdadsad")
print("n = ", n)

Результат роботи програми

n = 5

 

2. Функція IsCharDigit(). Визначити, чи є цифрою символ, що заданий номером позиції в рядку

Функція IsCharDigit() визначає, чи є цифрою символ, що розміщується у вказаній позиції рядка. Функція отримує параметри:

  • рядок, в якому здійснюється пошук;
  • номер позиції символу, який потрібно перевіряється.

Нижче наведено 4 способи реалізації функції.

 

2.1. Спосіб 1. Безпосереднє визначення належності символу діапазону цифр

При цьому способі для визначення цифри використовується порівняння виду

(s[index]>='0') and (s[index]<='9')

в якому здійснюється визначення належності окремого символу s[index] діапазону чисел від ‘0’ до ‘9’.

# Визначення, чи в заданій позиції рядка розміщується цифра
def IsCharDigit(s, index):
    # Перевірка, чи коректне значення index
    if (index<0)or(index>len(s)-1):
        return False
    return (s[index]>='0')and(s[index]<='9')

# Ввід рядка
s = input("s = ")

# Ввід індексу
index = int(input("index = "))

# Виведення результату
if IsCharDigit(s, index):
    print("Yes")
else:
    print("No")

Результат виконання програми

s = ABC123DEF
index = 4
Yes

 

2.2. Спосіб 2. Використання функції ord()

В цьому способі можна використати функцію ord(), яка повертає код символу. Символ ‘0’ має код 48, символ ‘1’ має код 49 і т.д. Відповідно, символ, що відповідає останній цифрі, має код 57.

Тому, у вищенаведеному прикладі (спосіб 1) фрагмент рядка

(s[index]>='0')and(s[index]<='9')

можна замінити наступним фрагментом рядка

(ord(s[index])>=48)and(ord(s[index])<=57)

 

2.3. Спосіб 3. Використання стандартної функції isdigit()

Функція isdigit() з бібліотеки Python дозволяє визначити, чи символ є цифрою. З врахуванням цього, модифікований варіант функції IsCharDigit() має вигляд

# Визначення, чи в заданій позиції рядка розміщується цифра
def IsCharDigit(s, index):
    # Перевірка, чи коректне значення index
    if (index<0)or(index>len(s)-1):
        return False
    return s[index].isdigit()

# Ввід рядка
s = input("s = ")

# Ввід індексу
index = int(input("index = "))

# Виведення результату
if IsCharDigit(s, index):
    print("Yes")
else:
    print("No")

 

2.4. Спосіб 4. Використання рядка-порівняння

Цей спосіб добре підходить для визначення належності символу деякій множині символів, яка містить усі можливі значення. Символи, що утворюють множину символів для порівняння, формуються у вигляді рядка. У нашому випадку порівнюються символи цифр, тому рядок порівняння має вигляд:

sAll = "0123456789"

Вищенаведений рядок містить усю множину цифр числа. Відповідно до вищесказаного, змінена функція IsCharDigit() має такий вигляд.

# Визначення, чи в заданій позиції рядка розміщується цифра
def IsCharDigit(s, index):
    # Перевірка, чи коректне значення index
    if (index<0)or(index>len(s)-1):
        return False

    # Рядок, що містить усі можливі значення, що відповідають цифрі
    sAll = "0123456789"

    # Цикл пошуку в рядку sAll символа s[index]
    for c in sAll:
        if c == s[index]: # якщо символ s[index] є в наборі допустимих символів
            return True

    return False

# Ввід рядка
s = input("s = ")

# Ввід індексу
index = int(input("index = "))

# Виведення результату
if IsCharDigit(s, index):
    print("Yes")
else:
    print("No")

 

3. Функція IsCharOp(). Визначити кількість символів +, –, *, /, % у рядку

Функція IsCharOp() отримує параметром рядок і визначає кількість символів операцій (+, –, *, /, %) у цьому рядку. Щоб зменшити кількість порівнянь, у функції використовується додатковий рядок

sAll = "+-*/%"

який містить усі допустимі символи операцій.

# Визначення, чи в заданій позиції рядка розміщується цифра
def IsCharOp(s):
    # Рядок, що містить усі можливі значення, що відповідають цифрі
    sAll = "+-*/%"

    # Цикл визначення кількості символів в рядку
    k = 0 # результат
    for c1 in s:
        for c2 in sAll:
            if c1==c2:
                k = k+1

    return k

# Ввід рядка
s = input("s = ")

# Обчислення та вивід результату
k = IsCharOp(s)
print("k = ", k)

Результат виконання програми

s = fhg+-/*%%%++-ghjg+-%
k = 13

 

4. Функція GetNOccurs(). Визначення, скільки разів у даному рядку зустрічається заданий рядок
4.1. Використання стандартної функції count()

У мові Python є функція count(), яка визначає, скільки разів у даному рядку зустрічається заданий підрядок.

# Визначити, скільки в рядку зустрічається підрядок
s1 = "abc abcd bcd defg bcdef"
s2 = "bc"
k = s1.count(s2)
print("k = ", k)

Результат виконання програми

k = 4

 

4.2. Розв’язок без використання функції count()

 

# Визначити, скільки в рядку зустрічається підрядок
def GetNOccurs(sub, s):
    k = 0 # результат
    index_s = 0 # позиція в рядку s з якої відбувається пошук підрядка

    while (index_s < len(s)):
        f_is=True # прапорець наявності підрядка в рядку
        index_sub = 0 # індекс початку порівняння у рядку sub

        # цикл пошуку підрядка в рядку
        while index_sub<len(sub):
            # перевірка, чи не досягнуто кінець рядка s
            if (index_s+index_sub) == len(s):
                f_is = False
                index_s = len(s)-1
                break

            # перевірка на неспівпадіння символів
            if s[index_s+index_sub]!=sub[index_sub]:
                f_is = False
                break
            else:
                index_sub = index_sub+1

        # Перевірка, чи всі символи рядка і підрядка співпали
        if f_is:
            index_s = index_s + len(sub) # обробка, якщо співпали
            k = k+1
        else:
            index_s = index_s+1 # обробка, якщо не співпали

    return k

# Використання функції GetNOccurs()
s1 = "abccc bcccca bcd"
s2 = "cc"
k = GetNOccurs(s2, s1)
print("k = ", k)

Результат виконання програми

k = 3

 

5. Функція GetPosFirstOccur(). Визначити позицію (номер) першого входження підрядка в рядку

У мові Python є цілий ряд стандартних функцій, які визначають позицію входження підрядка в рядку. Більш детально про ці стандартні функції описується тут.

У даному прикладі реалізовано власну функцію GetPosFirstOccur(), яка визначає позицію (номер) першого входження підрядка в рядку.

# Визначити позицію першого входження підрядка в рядку.
# Рядок переглядається зліва-направо.
def GetPosFirstOccur(sub, s):
    index_s = 0 # позиція в рядку s з якої відбувається пошук підрядка

    while (index_s < len(s)):
        f_is=True # прапорець наявності підрядка в рядку
        index_sub = 0 # індекс початку порівняння у рядку sub

        # цикл пошуку підрядка в рядку
        while index_sub<len(sub):
            # перевірка, чи не досягнуто кінець рядка s
            if (index_s+index_sub) == len(s):
                f_is = False
                index_s = len(s)-1
                break

            # перевірка на неспівпадіння символів
            if s[index_s+index_sub]!=sub[index_sub]:
                f_is = False
                break
            else:
                index_sub = index_sub+1

        # Перевірка, чи всі символи рядка і підрядка співпали
        if f_is:
            return index_s # якщо співпали, то повернути позицію
        else:
            index_s = index_s+1 # обробка, якщо не співпали

    return -1 # якщо не знайдено підрядка, то повернути -1

# Використання функції GetPosFirsOccur()
s1 = "abccc bcccca bcd"
s2 = "cd"
pos = GetPosFirstOccur(s2, s1)
print("pos = ", pos)

Результат виконання програми

pos = 14

 

6. Функція IsSubstringToString(). Визначення наявності підрядка в рядку

Версія 1. У даній функції можна викликати попередньо розроблену функцію GetNOccurs() з пункту 4.2. Потім обробити повернуте значення k. Якщо k>0, то підрядок є в рядку, якщо k=0, то підрядка в рядку немає. Текст функції буде приблизно таким:

# Функція IsSubstringToString()
def IsSubstringToString(sub, s):
    k = GetNOccurs(sub, s) # Викликати функцію з п. 4.2.
    if (k==0):
        return False
    else:
        return True

 


Зв’язані теми