Pythonské programy pro operace s řetězci

V tomto tutoriálu budete psát programy Python, které řeší často kladené otázky týkající se operací s řetězci.

Dozvíte se, jak zkontrolovat, zda jsou řetězce Python palindromy, anagramy a jsou v názvu.

Python Strings: Rychlý přehled

V Pythonu jsou řetězce výkonné vestavěné datové typy. Mohou uložit sekvenci znaků.

Indexování v řetězcích Pythonu: Stejně jako všechny iterovatelné Python jsou řetězce také indexovány nulou. Platné indexy pro řetězec délky N jsou tedy 0, 1, 2 až N – 1.

Python také podporuje negativní indexování pro přístup k prvkům od konce řetězce. Takže -1 je index posledního znaku v řetězci, -2 je index předposledního znaku v řetězci a tak dále.

Neměnnost řetězců Pythonu: Řetězce v Pythonu jsou navíc neměnné, takže je nemůžete upravovat na místě. Můžete však na nich volat několik řetězcových metod a získat kopie řetězců s požadovaným výsledkem.

Nyní, když jsme si prošli základy pythonských řetězců, pojďme řešit několik jednoduchých, ale zajímavých problémů.

Začněme.

Zkontrolujte, zda je řetězec Python Palindrom

Problém: Vzhledem k řetězci Pythonu zkontrolujte, zda se nejedná o palindrom.

Pokud ano, vraťte True; jinak vraťte False.

Takže naším prvním problémem je zkontrolovat, zda daný řetězec je palindrom nebo ne.

Palindrom je řetězec, který se čte stejně zleva doprava i zprava doleva. Uveďme si několik příkladů: závodní auto, referát, hladina, madam, radar a tak dále.

Zde jsou kroky k vyřešení tohoto problému:

  • Získejte obrácenou kopii řetězce a v případě potřeby ji uložte do jiné proměnné.
  • Porovnejte hodnoty původního řetězce a obráceného řetězce.
  • Pokud jsou stejné, řetězec je palindrom. Takže vraťte True a přestaňte.
  • Pokud si původní a obrácené kopie nejsou stejné, řetězec není palindrom. Takže bychom měli vrátit False.
  Jak blokovat nebo smazat přátele ve WeChat

Klíčovou operací je získat obrácenou kopii řetězce. V Pythonu to můžete udělat několika různými způsoby.

Projdeme si však dva přístupy:

  • Pomocí krájení provázků
  • Pomocí funkce reversed() a metody join().

Jak obrátit řetězec Pythonu pomocí krájení

Syntaxe < libovolný_str>[start: stop: step] vrátí část řetězce od začátku do, ale bez zastavení, s krokem velikosti kroku.

  • Pokud vynecháte start, řez začíná na začátku řetězce.
  • Pokud nezadáte stop index, řez se rozšíří až na konec řetězce.
  • A záporné hodnoty kroku lze použít k vrácení řezů začínajících od konce řetězce.

Takže [::-1] vrátí obrácenou kopii řetězce.

Následující buňka kódu obsahuje definici funkce is_palindrome().

Jako argument bere řetězec a vrací True nebo False v závislosti na tom, zda se jedná o palindrom či nikoli.

Zde jsme použili krájení řetězce k získání zpětné kopie řetězce.

def is_palindrome(this_str):
  rev_str = this_str[::-1]
  if (this_str == rev_str):
    return True
  else:
    return False

▶️ Nyní, když jsme definovali funkci, můžeme pokračovat a volat s jakýmkoli platným řetězcem jako argumentem.

is_palindrome("racecar")
True

Ve výše uvedené buňce s kódem je závodní auto palindrom. Takže funkce is_palindrome() vrátí True podle očekávání.

Nyní zkuste funkci zavolat s libovolným řetězcem, který není palindrom, například river.

is_palindrome("river")
False

A jak vidíte, vrací False, což je správně. ✅

Jak obrátit řetězec Pythonu pomocí reverse() a join()

V Pythonu můžete použít metodu join() spolu s funkcí reversed() k obrácení řetězce.

  • Funkce reversed() vrací zpětný iterátor mezi znaky v řetězci.
  • Metodu join() pak lze použít ke spojení těchto znaků v opačném pořadí.

Pomocí výše uvedené metody můžete přepsat funkci is_palindrome() jako v buňce kódu níže.

def is_palindrome(this_str):
  rev_str="".join(reversed(this_str))
  if (this_str == rev_str):
    return True
  else:
    return False

Můžete také použít funkci is_palindrome() v rámci přehledu seznamu ke shromáždění všech palindromů z delšího seznamu řetězců.

str_list = ["refer","blue","level","12321","dragon"]

palindromes = [string for string in str_list if is_palindrome(string)]
print(palindromes)
# Output
['refer', 'level', '12321']

Výše uvedený kód funguje takto:

  • Projděte seznam str_list, zavolejte is_palindrome() na každý řetězec.
  • Pokud is_palindrome() vrátí hodnotu True, přidejte řetězec do seznamu palindromů.

Jak můžete vidět ve výstupu výše, palindromy je seznam všech palindromických řetězců v str_list.

  Jak hrát Dungeon Defenders na Linuxu

Zkontrolujte, zda jsou dva řetězce Pythonu anagramy

Další oblíbenou otázkou, se kterou se můžete v rozhovorech setkat, je zkontrolovat, zda dvojice řetězců str1 a str2 jsou anagramy.

Dva řetězce se považují za přesmyčky, pokud jsou počty znaků v těchto dvou řetězcích přesně stejné. To znamená, že můžete získat jeden z řetězců permutací nebo přeskupením znaků v druhém řetězci.

Příklady přesmyček zahrnují state-taste, save-vase, loket-below a tak dále.

Jak zkontrolovat anagramy pomocí objektu Counter v Pythonu

Jednoduchým a intuitivním způsobem je vypočítat počet výskytů každého znaku ve dvou řetězcích. A pak zkontrolujte, zda jsou počty stejné.

O to snadněji to lze provést pomocí objektu Counter z modulu itertools. The Čelit objekt vrátí pythonovský slovník: se znaky jako klíči a odpovídajícími počty jako hodnotami.

Zvažte řetězce „uložit“ a „váza“, jak je uvedeno níže.

str1 = "save"
str2 = "vase"

Zde jsou c1 a c2 objekty čítače obsahující počty znaků v řetězcích str1 a 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 vrátí True, protože str1 a str2 jsou anagramy.

Pomocí této logiky můžeme nyní pokračovat a definovat funkci are_anagrams() se dvěma parametry slovo1 a slovo2. V těle funkce zkontrolujeme, zda Counter(word1) == Counter(word2).

def are_anagrams(word1, word2):
  if Counter(word1) ==  Counter(word2):
    return True
  else:
    return False

▶️ Pro ověření zavolejte are_anagrams() s argumenty str1, str2. Protože str1 a str2 jsou anagramy („uložit“ a „váza“), funkce vrátí True, což je správně.

are_anagrams(str1, str2)
True

Jak zkontrolovat anagramy pomocí tříděných kopií řetězců

Můžete to udělat ještě jiným způsobem.

Pokud jsou dva řetězce anagramy, pak jsou jejich seřazené kopie stejné.

Můžeme tedy přepsat funkci are_anagrams(), abychom zkontrolovali, zda setříděná verze str1 je stejná jako seřazená kopie str2. Jsou-li stejné, pak jsou tyto dva řetězce anagramy; jinak nejsou.

Pomocí výše uvedené metody pro kontrolu rovnosti seřazených kopií můžeme přepsat funkci are_anagrams() následovně.

def are_anagrams(word1, word2):
  if sorted(word1) ==  sorted(word2):
    return True
  else:
    return False

Nyní provedeme několik volání funkcí.

  • Řetězce „loket“ a „dole“ jsou anagramy a funkce are_anagrams() vrací True.
  • A „stav“ a „ochutnáno“ nejsou anagramy a funkce vrací False.
are_anagrams("below","elbow")
True

are_anagrams("state","tasted")
False

Zkontrolujte, zda je řetězec Python v názvu případu

Zde je naše poslední otázka pro tento tutoriál.

  Jak automaticky otevřít odkazy v Chrome na iPhone a iPad

Problém: Je zadán řetězec: jméno osoby – s křestním jménem a příjmením.

Musíte zkontrolovat, zda je první písmeno jména i příjmení velké.

Tento typ velkých a malých písmen, kdy je první písmeno každého slova velké, se nazývá velká a malá písmena.

Takže musíte zkontrolovat, zda je jméno v názvu velkým písmenem:

1. Pokud ano, vytiskněte zprávu, že formátování je v názvu.

2. V opačném případě vraťte kopii řetězce naformátovanou v názvu

  • Python má vestavěnou řetězcovou metodu istitle(), která kontroluje, zda je řetězec v názvu.

.istitle() vrací True, pokud je řetězec formátován v názvu, jinak vrací False.

  • A metoda string() Pythonu vrací kopii řetězce naformátovanou v případě názvu.

Nyní tedy můžete použít tyto dvě metody k vyřešení problému.

Definujte funkci check_titlecase(), která přijímá název jako argument.

  • U vstupního řetězce můžete zavolat metodu istitle() a zkontrolovat, zda je formátován velkými písmeny.
  • Pokud je True, můžete vytisknout, že řetězec je již v názvu.
  • Jinak můžete zavolat metodu title() a vrátit kopii řetězce v případě názvu.

Následující buňka kódu zobrazuje definici funkce check_titlecase().

def check_titlecase(name):
  if name.istitle():
    print(f"'{name}' is already formatted in title case.")
  else:
    return name.title()

Zavolejte nyní metodu check_titlecase() s argumentem.

check_titlecase("jane smith")

# Output
Jane Smith

Ve výše uvedeném výstupu můžete vidět, že řetězec „Jane Smith“ je nyní v názvu.

▶️ Vezměme si další příklad.

check_titlecase("agatha Christie")

# Output
Agatha Christie

Tentokrát zavolejme funkci pomocí řetězce s malými písmeny v názvu.

check_titlecase("Grace Hopper")

# Output
'Grace Hopper' is already formatted in title case.

Dostaneme upozornění, že řetězec je naformátován v případě názvu a funkce funguje podle očekávání.

Závěr 👩‍🏫

Nyní si shrňme problémy, o kterých jsme dosud diskutovali.

  • Chcete-li zkontrolovat, zda je řetězec palindrom, zkontrolujte, zda jsou řetězec a jeho obrácená verze stejné. K obrácení řetězců můžete použít krájení řetězců nebo vestavěné metody.
  • Chcete-li zkontrolovat, zda jsou dva řetězce anagramy, zkontrolujte, zda jsou jejich seřazené kopie stejné. A k řazení řetězce použijte vestavěnou funkci sort() .
  • Chcete-li ověřit, zda je název v názvu velkými písmeny, použijte ke kontrole metodu .isttitle() a metodu .title() k získání kopie řetězce s malými písmeny v názvu.

Doufám, že se vám tento tutoriál o řetězcích Pythonu líbil. Jako další krok se naučte, jak používat porozumění seznamu v Pythonu, nebo se dozvíte o nerovném operátoru v Pythonu.

Veselé učení a kódování!🎉