Előző - #34 Nagybetűk | Tartalomjegyzék | Következő - #36 Reverse String
getTitleCase('cat dog moose') → 'Cat Dog Moose'
Ebben a gyakorlatban egy karakterláncot kell konvertálnia a cím kis- és nagybetűjévé, ahol a karakterlánc minden szava nagybetűvel kezdődik. A szó többi betűje kisbetűs. A cím kis- és nagybetűje enyhén bonyolultabb a 34. gyakorlathoz (Nagybetűk) képest, ezért azt tanácsolom, hogy oldja meg ezt a gyakorlatot, mielőtt megpróbálná ezt.
Gyakorlat leírása
Írjon getTitleCase()függvényt paraméterrel text. A függvénynek vissza kell adnia a karakterlánc címének kis- és nagybetűs alakját: minden szó nagybetűvel kezdődik, a többi betű pedig kisbetűs. A nem betű karakterek választják el a szavakat a karakterláncban. Ez azt jelenti, hogy 'Hello World'ezt két szónak, míg 'HelloWorld'egy szónak tekintik. Nem csak a szóközök, hanem az összes nem betű karakter is elválaszthatja a szavakat, így a „Hello5World” és 'Hello@World' két szó is van.
A Python upper()és az alsó() karakterlánc metódusai a karakterlánc nagy- és kisbetűs alakját adják vissza, és ezeket felhasználhatja a megvalósításban. Használhatja a isalpha()string metódust is, amely igaz értéket ad vissza , ha a karakterlánc csak kis- vagy nagybetűket tartalmaz. Nem használhatja azonban a Python title() karakterlánc-metódusát, mivel az ellentétes a gyakorlat céljával. Hasonlóképpen, miközben egy karakterláncot egyedi szavakra kell felosztania, ne használja a Python split() string metódusát.
Ezek a Python- assertutasítások leállítják a programot, ha feltételük False. Másolja őket a megoldási program aljára. Az Ön megoldása akkor helyes, ha a következő assertállítások feltételei mind igazak :
assert getTitleCase('Hello, world!') == 'Hello, World!'
assert getTitleCase('HELLO') == 'Szia'
assert getTitleCase('hello') == 'Szia'
assert getTitleCase('hElLo') == 'Szia'
assert getTitleCase('') == ''
assert getTitleCase('abc123xyz') == 'Abc123Xyz'
assert getTitleCase('cat dog RAT') == 'Cat Dog Rat'
assert getTitleCase('cat,dog,RAT') == 'Macska,kutya,patkány'
véletlenszerű importálás
random.seed(42)
chars = list('abcdefghijklmnopqrstuvwxyz1234567890 ,.')
i tartományban (1000):
random.shuffle(karakterek)
assert getTitleCase(''.join(chars)) == ''.join(chars).title()
A hurokban lévő kód forvéletlenszerű karakterláncokat generál, és ellenőrzi, hogy a függvény getTitleCase() ugyanazt a karakterláncot adja-e vissza, mint a Python beépített title() karakterlánc-metódusa. Ez lehetővé teszi számunkra, hogy gyorsan 1000 tesztesetet generáljunk az Ön megoldásához.
Próbáljon megoldást írni a leírásban szereplő információk alapján. Ha továbbra is problémái vannak ennek a gyakorlatnak a megoldásával, további tippekért olvassa el a Megoldástervezés és a Különleges esetek és Gotchák című részt.
Előfeltétel fogalmak: karakterláncok, for hurkok, range(), len(), felső() , isalpha(), alsó()
Megoldás tervezése
A fő kihívás ebben a gyakorlatban nem a betűk nagy- és kisbetűvé alakítása, hanem a karakterlánc felosztása egyes szavakra. Nem kell használnunk a Python split()karakterlánc-módszerét vagy a speciális reguláris kifejezések könyvtárát. Tekintse meg a 35-1. ábrán a három példakarakterláncot, ahol minden szó első betűje kiemelve van.
Ha megnézzük ezeket a példákat, kitalálhatjuk, hogy a karakterláncban lévő karaktert az teszi a szó első betűjévé, hogy a karakter vagy a karakterlánc első karaktere (az indexnél 0), vagy egy nem betű karaktert követ. A cím kis- és nagybetűs karakterláncában ezek a betűk nagybetűvel, a többi betű pedig kisbetűvel szerepel. A nem betű karakterek változatlanok maradnak.
Függvényünk kezdődhet egy olyan nevű változóval, titledText amely a paraméter megnevezésének karakterlánc-formáját tartalmazza, text ahogy azt felállítjuk. Ekkor egy forciklus a karakterlánc összes indexén át tud hurkolni. Ha az index 0 (azaz a karakterlánc elején van), vagy az előző indexben lévő karakter nem betű, adja hozzá a karakter nagybetűs alakját a titledText -hez . Ellenkező esetben adja hozzá a karakter kisbetűs alakját a karakterhez titledText.
Vegye figyelembe, hogy a Python upper()és az alsó() string metódusok nincsenek hatással a nem betű karakterekből álló karakterláncokra. A kifejezés '42!'.upper() és '42!'.lower()mindkettő értéke '42!' .
Mire a forciklus véget ér, titledTexttartalmazza a teljes cím kis- és nagybetűs szöveget a függvény visszaadásához.
Különleges esetek és Gotchák
A cím kis- és nagybetűje nem csak azt jelenti, hogy az első betű nagybetűs, hanem az összes többi betűnek kisbetűnek kell lennie. Nem elég csak az első betűt nagybetűvé tenni. A fennmaradó betűket is kisbetűssé kell tenni. Ha a karakterláncot 'mcCloud'a cím kis- és nagybetűssé alakítja, akkor az nem, 'McCloud'hanem a „Mccloud” lesz .
Van egy határfeltétel is, amelyet figyelembe kell vennie, amikor a ciklusban az „előző indexet” nézi for. Könnyen kiszámíthatja az előző indexet az indexből i a kifejezéssel i - 1, de van egy bökkenő: amikor ivan , ez -1-0 et eredményez , ami a karakterlánc utolsó indexére vonatkozik. A kódnak kifejezetten meg kell győződnie arról, hogy nem az előző indexet ellenőrzi a karakterlánc első indexénél, mert ebben az esetben nincs korábbi index.
Now try to write a solution based on the information in the previous sections. If you still have trouble solving this exercise, read the Solution Template section for additional hints.
Solution Template
Try to first write a solution from scratch. But if you have difficulty, you can use the following partial program as a starting place. Copy the following code from https://invpy.com/titlecase-template.py and paste it into your code editor. Replace the underscores with code to make a working program:
def getTitleCase(text):
# Create a titledText variable to store the titlecase text:
titledText = ____
# Loop over every index in text:
for i in range(len(____)):
# The character at the start of text should be uppercase:
if i == ____:
titledText += text[i].____()
# If the character is a letter and the previous character is
# not a letter, make it uppercase:
elif text[____].isalpha() and not text[i - ____].isalpha():
titledText += text[____].upper()
# Otherwise, make it lowercase:
else:
titledText += text[i].____()
# Return the titled cased string:
return titledText
The complete solution for this exercise is given in Appendix A and https://invpy.com/titlecase.py. You can view each step of this program as it runs under a debugger at https://invpy.com/titlecase-debug/.
Prev - #34 Uppercase Letters | Table of Contents | Next - #36 Reverse String