Основные задачи на строки в языке Python
Практические задания по строкам
Как подсчитать количество вхождений символа в строке?
Наиболее эффективное решение: использовать метод count(). Он реализован на C и работает быстро даже для длинных строк.
text = "hello world"
print(text.count('l'))Python strip (метод strip в python)
2
Python повторить строку (повторение строки в python)
Метод возвращает число непересекающихся вхождений подстроки или символа.
Как сделать то же самое с помощью цикла?
text = "hello world"
count = 0
for ch in text:
if ch == 'l':
count += 1
print(count)
Tuple в str python (преобразование кортежа в строку в python)
2
Python объект в строку (преобразование объекта в строку в python)
Этот способ помогает лучше понять итерацию по строке, но менее производителен.
Как использовать collections.Counter для подсчета всех символов?
from collections import Counter
text = "hello world"
c = Counter(text)
print(c['l'])Python convert string (преобразование строк в python)
2
Python str to bytes (преобразование строки в байты в python)
Counter удобен, когда нужна статистика по всем символам сразу. Он возвращает словарь с частотами.
Типичные ошибки: забыть, что count() чувствителен к регистру. Решение: привести строку к одному регистру перед подсчетом.
text = "Hello World"
print(text.lower().count('l')) # 3функция разделить python (разделение строки на список в python)
Еще одна проблема: метод count() считает только непересекающиеся вхождения. Для пересекающихся шаблонов (например, подсчет "aa" в "aaa") этот метод не подходит – тогда нужно использовать цикл или регулярные выражения.
Как проверить, является ли строка палиндромом?
Самый эффективный способ: сравнить строку с её обратной версией через срез [::-1]. Эта операция в Python оптимизирована.
def is_palindrome(s):
return s == s[::-1]
print(is_palindrome("racecar")) # True
print(is_palindrome("hello")) # Falseвывести первый символ строки python (вывести первый символ строки в python)
True False
вывести символ строки python (вывод символа строки в python)
Метод работает за O(n) по времени и O(n) по памяти (создается копия).
Как проверить палиндром с учетом пробелов и регистра?
def is_palindrome_clean(s):
cleaned = ''.join(ch.lower() for ch in s if ch.isalnum())
return cleaned == cleaned[::-1]
print(is_palindrome_clean("A man, a plan, a canal: Panama")) # Trueвывести длину строки python (вывести длину строки в python)
True
вывести элемент строки python (вывод конкретного символа строки по индексу в python)
Здесь фильтруются только буквы и цифры, а регистр приводится к нижнему.
Как решить задачу без создания обратной строки, используя два указателя?
def is_palindrome_two_pointers(s):
left, right = 0, len(s) - 1
while left < right:
if s[left] != s[right]:
return False
left += 1
right -= 1
return True
print(is_palindrome_two_pointers("racecar")) # Trueзадания на строки python (задания на строки в python)
True
замена символов python (замена символов в строке python)
Этот способ экономит память (O(1) дополнительно), но в Python разница обычно незаметна.
Типичные ошибки: не учитывать пробелы и знаки препинания. Если в задаче требуется игнорировать их, то прямое сравнение s == s[::-1] даст неверный результат. Также часто забывают про регистр: "Racecar" не будет палиндромом без приведения. Решение – предварительная очистка строки.
Как удалить все повторяющиеся символы из строки, сохранив порядок?
Наиболее эффективное решение в Python 3.7+: использовать dict.fromkeys(), который сохраняет порядок вставки и удаляет дубликаты.
def remove_duplicates(s):
return ''.join(dict.fromkeys(s))
print(remove_duplicates("banana")) # banPython первое слово в строке (извлечение первого слова из строки в python)
ban
Python последнее слово в строке (извлечение последнего слова из строки в python)
Метод работает за O(n) и не требует дополнительных импортов.
Как решить задачу с помощью OrderedDict для версий Python старше 3.7?
from collections import OrderedDict
def remove_duplicates(s):
return ''.join(OrderedDict.fromkeys(s))
print(remove_duplicates("banana")) # banиндекс элемента строки python (получение индекса символа или подстроки в строке python)
ban
Python номера символов (номера (индексы) символов в строке python)
OrderedDict гарантирует порядок в любых версиях Python.
Как выполнить удаление дубликатов с помощью цикла и списка?
def remove_duplicates(s):
seen = []
for ch in s:
if ch not in seen:
seen.append(ch)
return ''.join(seen)
print(remove_duplicates("banana")) # banPython новая строка (использование символа новой строки в python)
ban
Python строки find (метод find для строк)
Этот вариант понятен, но менее эффективен (O(n^2) из-за проверки in в списке). Лучше использовать множество для проверки, но множество не сохраняет порядок.
Как сохранить только первое вхождение с помощью множества и списка?
def remove_duplicates(s):
seen = set()
result = []
for ch in s:
if ch not in seen:
seen.add(ch)
result.append(ch)
return ''.join(result)
print(remove_duplicates("banana")) # banPython string index (метод str.index в python)
ban
Этот подход работает за O(n) и явно показывает логику.
Типичные ошибки: попытка использовать set() напрямую (''.join(set(s))) – порядок символов не сохраняется. Еще одна ошибка: считают, что dict.fromkeys() работает только для строк – это универсально.
Дополнительные расширенные примеры работы со строками
Как удалить все знаки препинания из строки?
Использование str.translate() с str.maketrans – самый быстрый способ для больших текстов.
import string
text = "Привет, мир! Как дела?"
translator = str.maketrans('', '', string.punctuation)
cleaned = text.translate(translator)
print(cleaned) # Привет мир Как дела
Привет мир Как дела
Метод maketrans создает таблицу перевода, где третьему аргументу передаются символы, которые нужно удалить. Для русского текста string.punctuation содержит только английские знаки, поэтому лучше создать свою строку с русскими пунктуационными символами.
Как отформатировать строку, используя значения из словаря?
Метод str.format_map() позволяет подставлять значения динамически, не распаковывая словарь.
data = {"name": "Анна", "age": 25}
template = "Меня зовут {name}, мне {age} лет."
print(template.format_map(data))
Меня зовут Анна, мне 25 лет.
Это безопаснее, чем %-форматирование, и удобнее, чем f-строки, когда шаблон хранится отдельно.
Как разбить строку по нескольким разделителям?
Стандартный split() принимает только один разделитель. Для нескольких используйте модуль re.
import re
text = "яблоко;груша,вишня.апельсин:банан"
words = re.split(r'[;,\.:]', text)
print(words) # ['яблоко', 'груша', 'вишня', 'апельсин', 'банан']
['яблоко', 'груша', 'вишня', 'апельсин', 'банан']
Регулярное выражение [;,\.:] задает множество разделителей. Обратите внимание на экранирование точки.
Как найти все позиции вхождения подстроки?
Метод find() находит только первое вхождение. Для всех позиций используйте цикл или генератор.
def find_all(text, sub):
start = 0
positions = []
while True:
pos = text.find(sub, start)
if pos == -1:
break
positions.append(pos)
start = pos + 1
return positions
print(find_all("abcabcabc", "abc")) # [0, 3, 6]
[0, 3, 6]
Альтернатива – использование регулярных выражений с re.finditer() для получения объектов совпадений.
Как преобразовать строку в список символов и обратно?
Простейший способ – list(s) и ''.join(list). Но если нужны дополнительные манипуляции, можно использовать списковые включения.
s = "hello"
chars = [c.upper() for c in s]
print(chars) # ['H', 'E', 'L', 'L', 'O']
new_s = ''.join(chars)
print(new_s) # HELLO
['H', 'E', 'L', 'L', 'O'] HELLO
Обратите внимание, что join работает только со списком строк – попытка объединить список чисел вызовет ошибку.
Как сравнить две строки без учета регистра и пробелов?
Используйте нормализацию через casefold() и удаление пробелов.
s1 = "Hello World"
s2 = "hello world"
if s1.casefold() == s2.casefold():
print("Строки равны")
Строки равны
casefold() более агрессивный, чем lower(), и правильно обрабатывает символы вроде немецкого 'ß'.
Как заменить несколько разных подстрок одновременно?
Метод replace() заменяет только одну подстроку. Для множественных замен используйте re.sub() или итеративный подход.
import re
text = "кошка и собака"
replacements = {"кошка": "кот", "собака": "пёс"}
pattern = re.compile('|'.join(map(re.escape, replacements.keys())))
result = pattern.sub(lambda m: replacements[m.group(0)], text)
print(result) # кот и пёс
кот и пёс
Этот метод эффективен, когда количество замен велико. Можно также использовать цикл с последовательными вызовами replace(), но для большого словаря это медленнее.