Програми на 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 с помощта на нарязване

Синтаксисът [start: stop: step] връща част от низа от стартиране до, но без да включва спиране, със стъпка на размера на стъпката.

  • Ако пропуснете началото, срезът започва в началото на низа.
  • Ако не посочите стоп индекса, срезът се простира до края на низа.
  • А отрицателните стойности на стъпката могат да се използват за връщане на отрязъци, започващи от края на низа.

Така че [::-1] връща обърнато копие на низа.

Следната кодова клетка съдържа дефиницията на функцията 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.

  Поправете фаталната грешка на риска от дъжд в действие номер 1

Проверете дали два низа на 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 е в главни букви

Ето нашия последен въпрос за този урок.

  Как да изпълните Chrome Openload Fix

Проблем: Даден е низ: име на човек – със собствено и фамилно име.

Трябва да проверите дали първата буква на името и фамилията са главни.

Този тип главни букви, при които първата буква на всяка дума е главна, се нарича главни букви.

Така че трябва да проверите дали името е в главни букви:

1. Ако да, изведете съобщение, че форматирането е в главни букви.

2. В противен случай върнете копие на низа, форматиран в главни букви

  • Python има вграден метод за низ istitle(), който проверява дали даден низ е в главни букви.

.istitle() връща True, ако низът е форматиран в главни букви, в противен случай връща False.

  • А 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.

Приятно учене и програмиране!🎉