
Програми на Python за операции с низове
В този урок ще пишете програми на Python за решаване на често задавани въпроси относно операции с низове.
Ще научите как да проверявате дали низовете на Python са палиндроми, анаграми и са в главни букви.
Python Strings: Бърз преглед
В Python низовете са мощни вградени типове данни. Те могат да съхраняват последователност от знаци.
Индексиране в низове на Python: Както всички итерируеми елементи на Python, низовете също са индексирани с нула. Така че валидните индекси за низ с дължина N са 0, 1, 2 до N – 1.
Python също поддържа отрицателно индексиране за достъп до елементи от края на низа. Така -1 е индексът на последния знак в низа, -2 е индексът на предпоследния знак в низа и т.н.
Неизменност на низовете на Python: Освен това низовете в Python са неизменни, така че не можете да ги променяте на място. Можете обаче да извикате няколко метода на низове върху тях и да получите копия на низове с желания резултат.
Сега, след като прегледахме основите на низовете на Python, нека продължим с решаването на някои прости, но интересни проблеми.
Да започваме.
Проверете дали низът на Python е палиндром
Проблем: Даден е низ на Python, проверете дали е палиндром или не.
Ако да, върнете True; в противен случай върнете False.
Така че първият ни проблем е да проверим дали даден низ е палиндром или не.
Палиндромът е низ, който се чете еднакво отляво надясно, както и отдясно наляво. Нека изброим няколко примера: състезателна кола, референт, ниво, мадам, радар и т.н.
Ето стъпките за решаване на този проблем:
- Получете обърнато копие на низа и го запазете в друга променлива, ако е необходимо.
- Сравнете стойностите на оригиналния низ и обърнатия низ.
- Ако са равни, низът е палиндром. Така че върнете True и спрете.
- Ако оригиналното и обърнатото копие не са равни, низът не е палиндром. Така че трябва да върнем False.
Ключовата операция е да се получи обърнато копие на низа. В Python има няколко различни начина, по които можете да направите това.
Въпреки това ще разгледаме два подхода:
- Използване на нарязване на низове
- Използване на функцията reversed() и метода join().
Как да обърнете низ на Python с помощта на нарязване
Синтаксисът
- Ако пропуснете началото, срезът започва в началото на низа.
- Ако не посочите стоп индекса, срезът се простира до края на низа.
- А отрицателните стойности на стъпката могат да се използват за връщане на отрязъци, започващи от края на низа.
Така че
Следната кодова клетка съдържа дефиницията на функцията is_palindrome().
Той приема низ като аргумент и връща True или False в зависимост от това дали е палиндром или не.
Тук използвахме нарязване на низове, за да получим обратно копие на низа.
def is_palindrome(this_str): rev_str = this_str[::-1] if (this_str == rev_str): return True else: return False
▶️ След като дефинирахме функцията, можем да продължим и да извикаме с всеки валиден низ като аргумент.
is_palindrome("racecar") True
В горната кодова клетка състезателната кола е палиндром. Така че функцията is_palindrome() връща True, както се очаква.
Сега опитайте да извикате функцията с произволен низ, който не е палиндром, като например river.
is_palindrome("river") False
И както можете да видите, той връща False, което е правилно. ✅
Как да обърнете низ на Python с помощта на reversed() и join()
В Python можете да използвате метода join() заедно с функцията reversed(), за да обърнете низ.
- Функцията reversed() връща обратен итератор през символите в низа.
- След това методът join() може да се използва за свързване на тези знаци в обратен ред.
Използвайки горния метод, можете да пренапишете функцията is_palindrome(), както в клетката с код по-долу.
def is_palindrome(this_str): rev_str="".join(reversed(this_str)) if (this_str == rev_str): return True else: return False
Можете също да използвате функцията is_palindrome() в разбирането на списъка, за да съберете всички палиндроми от по-дълъг списък от низове.
str_list = ["refer","blue","level","12321","dragon"] palindromes = [string for string in str_list if is_palindrome(string)] print(palindromes) # Output ['refer', 'level', '12321']
Ето как работи горният код:
- Преминете през str_list, извикайте is_palindrome() на всеки низ.
- Ако is_palindrome() върне True, добавете низа към списъка с палиндроми.
Както можете да видите в резултата по-горе, palindromes е списък на всички палиндромни низове в str_list.
Проверете дали два низа на Python са анаграми
Друг популярен въпрос, който може да срещнете в интервюта, е да проверите дали чифт низове str1 и str2 са анаграми или не.
Два низа се наричат анаграми, ако броят на знаците в двата низа е абсолютно еднакъв. Това означава, че можете да получите един от низовете чрез пермутиране или пренареждане на знаците в другия низ.
Примерите за анаграми включват state-taste, save-vase, elbow-below и т.н.
Как да проверите за анаграми с помощта на Counter Object в Python
Прост и интуитивен начин е да се изчисли броят на срещанията на всеки знак в двата низа. И след това проверете дали броят е равен.
Това може да се направи много по-лесно с помощта на обекта Counter от модула itertools. The Брояч обектът връща речник на Python: със знаците като ключове и съответните брои като стойности.
Помислете за низовете „save“ и „vase“, както е показано по-долу.
str1 = "save" str2 = "vase"
Тук c1 и c2 са обекти-броячи, съдържащи броя символи на низовете str1 и str2 съответно.
from collections import Counter c1 = Counter(str1) c2 = Counter(str2) print(c1) print(c2) c1 == c2 # Output Counter({'s': 1, 'a': 1, 'v': 1, 'e': 1}) Counter({'v': 1, 'a': 1, 's': 1, 'e': 1}) True
c1 == c2 връща True, тъй като str1 и str2 са анаграми.
Използвайки тази логика, сега можем да продължим и да дефинираме функцията are_anagrams() с два параметъра word1 и word2. В тялото на функцията проверяваме дали Counter(word1) == Counter(word2).
def are_anagrams(word1, word2): if Counter(word1) == Counter(word2): return True else: return False
▶️ За да проверите, извикайте are_anagrams() със str1, str2 като аргументи. Тъй като str1 и str2 са анаграми („save“ и „vase“), функцията връща True, което е правилно.
are_anagrams(str1, str2) True
Как да проверите за анаграми с помощта на сортирани копия на низове
Има и друг начин да направите това.
Ако два низа са анаграми, тогава сортираните им копия са равни.
Така че можем да пренапишем функцията are_anagrams(), за да проверим дали сортираната версия на str1 е същата като сортираното копие на str2. Ако са равни, тогава двата низа са анаграми; иначе не са.
Използвайки горния метод за проверка на равенството на сортираните копия, можем да пренапишем функцията are_anagrams(), както следва.
def are_anagrams(word1, word2): if sorted(word1) == sorted(word2): return True else: return False
Нека сега направим няколко извиквания на функции.
- Низовете „elbow“ и „below“ са анаграми и функцията are_anagrams() връща True.
- А „състояние“ и „дегустирано“ не са анаграми и функцията връща False.
are_anagrams("below","elbow") True are_anagrams("state","tasted") False
Проверете дали низът на Python е в главни букви
Ето нашия последен въпрос за този урок.
Проблем: Даден е низ: име на човек – със собствено и фамилно име.
Трябва да проверите дали първата буква на името и фамилията са главни.
Този тип главни букви, при които първата буква на всяка дума е главна, се нарича главни букви.
Така че трябва да проверите дали името е в главни букви:
1. Ако да, изведете съобщение, че форматирането е в главни букви.
2. В противен случай върнете копие на низа, форматиран в главни букви
- Python има вграден метод за низ istitle(), който проверява дали даден низ е в главни букви.
- А string методът title() на Python връща копие на низа, форматиран в главни букви.
Така че сега можете да използвате тези два метода за решаване на проблема.
Дефинирайте функция check_titlecase(), която приема име като аргумент.
- Можете да извикате метода istitle() на входния низ, за да проверите дали е форматиран в главни букви.
- Ако е True, можете да отпечатате, че низът вече е в главни букви.
- В противен случай можете да извикате метода title() и да върнете копие на низа в главни букви.
Следната клетка с код показва дефиницията на функцията check_titlecase().
def check_titlecase(name): if name.istitle(): print(f"'{name}' is already formatted in title case.") else: return name.title()
Нека сега извикаме метода check_titlecase() с аргумент.
check_titlecase("jane smith") # Output Jane Smith
В резултата по-горе можете да видите, че низът „Джейн Смит“ вече е в главни букви.
▶️ Нека вземем друг пример.
check_titlecase("agatha Christie") # Output Agatha Christie
Този път нека извикаме функцията с низ с малки и главни букви.
check_titlecase("Grace Hopper") # Output 'Grace Hopper' is already formatted in title case.
Получаваме известие, че низът е форматиран в главни букви и функцията работи според очакванията.
Заключение 👩🏫
Сега нека обобщим проблемите, които обсъдихме досега.
- За да проверите дали даден низ е палиндром, проверете дали низът и неговата обърната версия са равни. Можете да използвате нарязване на низове или вградени методи за обръщане на низове.
- За да проверите дали два низа са анаграми, проверете дали техните сортирани копия са еднакви. А за да сортирате низ, използвайте вградената функция sorted().
- За да проверите дали името е в главни букви, използвайте метода .istitle() за проверка и метода .title(), за да получите копие на низа с главни букви в заглавието.
Надявам се, че този урок за низовете на Python ви е харесал. Като следваща стъпка научете как да използвате разбиране на списък в Python или научете за оператора not equal в Python.
Приятно учене и програмиране!🎉