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.
Table of Contents
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.
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
- 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
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.
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.
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.
- 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í!🎉