Zadanie
Bazując na podanej sentencji stwórz nową w której każdy wyraz będzie miał naprzemiennie wielką i mała literę. Czyli przykładowy tekst:
Rozwiązanie
Range i slice
tekst = 'Jeśli człowiek da z siebie wszystko, to co mu jeszcze zostanie?' indeksy_do_zmiany = range(len(tekst))[::2] index = 0 nowy_tekst = '' for litera in tekst: if index in indeksy_do_zmiany: nowy_tekst += litera.upper() else: nowy_tekst += litera index += 1 print(nowy_tekst)
Output:
JeŚlI CzŁoWiEk dA Z SiEbIe wSzYsTkO, tO Co mU JeSzCzE ZoStAnIe?
W tym rozwiązaniu postanowiliśmy stworzyć listę wszystkich indeksów znaków, które należałoby zamienić na wielkie. Aby to zrobić posłużyliśmy się funkcją range. Funkcja ta zwraca nam kolekcję liczb z zadanego zakresu. W naszym przypadku były to liczby od 0 do 63 bo tyle ma właśnie znaków nasz tekst. Następnie dzięki mechanizmowi slice pobraliśmy z naszej kolekcji co drugą liczbę.
[ : : 2] czytamy następująco od początku kolekcji, aż do samego końca pobierz co drugi element
Warto zauważyć, że zmienne tekstowe (str) w Pytonie można traktować podobnie do listy. Oczywiście str to nie lista ale dla naszych obecnych potrzeb takie uproszczenie będzie pomocne. Zatem do elementów zmiennej tekstowej czyli do liter można odwoływać się za pomocą [].
>>> 'Lubie czytac'[2] 'b'
Z uwagi, że elementy numerujemy od zera to pod indeksem 2 kryje się literka 'b’
Idąc dalej, po zmiennych tekstowych można iterować się za pomocą pętli for
>>> for litera in 'Lubie czytac': ... print(litera) ... L u b i e c z y t a c
Wróćmy teraz do naszego przykładu.
Mamy już listę z indeksami liter które należałoby zamienić na wielkie. Teraz wystarczy przeliterować się po naszym tekście i poddać odpowiednie znaki ”powiększaniu” :). Brakuje nam jeszcze informacji jakie indeksy mają sprawdzane przez nas znaki. Aby naprawić ten problem wprowadziliśmy nową zmienną ”index”, która serwuje tą informację, Ważne by nie zapomnieć o zwiększaniu naszego licznika ”index” po każdym obiegu pętli. Jak już mamy wszystkie potrzebne komponenty możemy sprawdzić, czy indeks obecnie sprawdzanego znaku jest na liście znaków do ”powiększania”. Jeśli tak zamieniamy dany znak na wielki używając metody uppr(). Jeśli nie, dodajmy dany znak do naszego nowego ciągu znaków tak jak jest, czyli bez zmiany jego wielkości.
Funkcja modulo
tekst = 'Jeśli człowiek da z siebie wszystko, to co mu jeszcze zostanie?' nowy_tekst ='' for i in range(len(tekst)): if i % 2 == 0: nowy_tekst += tekst[i].upper() else: nowy_tekst += tekst[i] print(nowy_tekst)
Output:
JeŚlI CzŁoWiEk dA Z SiEbIe wSzYsTkO, tO Co mU JeSzCzE ZoStAnIe?
W tym rozwiązaniu użyliśmy operacji matematycznej modulo czyli reszty z dzielenia. Znowu za pomocą funkcji range stworzyliśmy kolekcję indeksów po której się iterujemy. Następnie dzięki funkcji modulo sprawdzamy każdy indeks.
>>> 1 % 2 1 >>> 2 % 2 0 >>> 3 % 2 1 >>> 4 % 2 0 >>>
Dzięki temu możemy rozróżnić, który indeks jest parzysty by wtedy zmienić literę pod tym indeksem na wielką.
Enumerate
tekst = 'Jeśli człowiek da z siebie wszystko, to co mu jeszcze zostanie?' nowy_teskt = [] for i, litera in enumerate(tekst): if i % 2 == 0: nowy_teskt.append(litera.upper()) else: nowy_teskt.append(litera) print(''.join(nowy_teskt))
Output:
JeŚlI CzŁoWiEk dA Z SiEbIe wSzYsTkO, tO Co mU JeSzCzE ZoStAnIe?
W Pythonie nie ma powodu by ręcznie tworzyć indeksy. Zamiast tego można użyć ”enumerate”. Funkcja ta zwraca nam generator serwujący tuple zawierające kolejne elementy z kolekcji wraz z ich indeksami. Potem do akcji wchodzi znana nam już operacja modulo.
Generator expression
print(''.join( litera.upper() if i % 2 == 0 else litera for i, litera in enumerate(tekst) ) )
Output:
JeŚlI CzŁoWiEk dA Z SiEbIe wSzYsTkO, tO Co mU JeSzCzE ZoStAnIe?
Jak zwykle na koniec naszych zmagań do akcji wkraczają kolekcje składane. Pamiętajcie, że narzucane przez Pythona wymagania dotyczące formatowania kodu nie dotyczą kolekcji składanych. Warto zatem zadbać by w tym przypadku nasz generator składany był zapisany w sposób zwiększający czytelność.
Fajnie, że pokazujesz różne sposoby rozwiązania, ale przydałoby się doprecyzować treść zadania lub uwzględnić kilka czynników przy rozwiązaniach.
1. „Bazując na podanej sentencji stwórz nową w której każdy wyraz będzie miał naprzemiennie wielką i mała literę. „. Jaki będzie wynikowy string dla wejścia „SIALA BABA MAK” ?
2. „naprzemiennie wielką i mała literę” -> „JeŚlI CzŁoWiEk dA”. Mamy wielkie „i” z 'jeśli’ obok wielkiego „c” z 'człowieka’. Miało być naprzemiennie 🙂
3. String złożony z samych białych znaków też będzie niepotrzebnie przetwarzany.