Zanurkuj w Pythonie/Łączenie list i dzielenie łańcuchów znaków

Z Wikibooks, biblioteki wolnych podręczników.

[edytuj] Łączenie listy i dzielenie łańcuchów znaków

Mamy listę, której elementy są w formie klucz=wartość. Załóżmy, że chcielibyśmy połączyć je wszystkie w pojedynczy łańcuch. Aby to zrobić, wykorzystamy metodę join obiektu typu string.

Poniżej został przedstawiony przykład łączenia listy w łańcuch znaków, który wykorzystaliśmy w funkcji buildConnectionString:

   return ";".join(["%s=%s" % (k, v) for k, v in params.items()])

Zanim przejdziemy dalej zastanówmy się nad pewną kwestią. Funkcje są obiektami, łańcuchy znaków są obiektami... wszystko jest obiektem. Można by było dojść do wniosku, że także zmienna jest obiektem, ale to akurat nie jest prawdą. Spójrzmy na ten przykład i zauważmy, że łańcuch znaków ";" sam w sobie jest obiektem i z niego można wywołać metodę join. Zmienne są etykietami dla obiektów.

Metoda join łączy elementy listy w jeden łańcuch znaków, a każdy element w zwracanym łańcuchu jest oddzielony od innego separatorem. W naszym przykładzie jest nim ";", lecz może nim być dowolny łańcuch znaków.

Uwaga! Uwaga!
Metoda join działa tylko z listami przechowującymi łańcuchy znaków. Nie korzysta ona z żadnych wymuszeń czy konwersji. Łączenie listy, która posiada co najmniej jeden lub więcej elementów niebędących łańcuchem znaków, rzuci wyjątek.
Przykład. Wyjście odbchelper.py
>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
>>> ["%s=%s" % (k, v) for k, v in params.items()]
['pwd=secret', 'database=master', 'uid=sa', 'server=mpilgrim']
>>> ";".join(["%s=%s" % (k, v) for k, v in params.items()])
'pwd=secret;database=master;uid=sa;server=mpilgrim'

Powyższy łańcuch znaków otrzymaliśmy podczas uruchamiania odbchelper.py.

W Pythonie znajdziemy także metodę analogiczną do metody join, ale która zamiast łączyć, dzieli łańcuch znaków na listę. Jest to funkcja split.

Przykład. Dzielenie łańcuchów znaków
>>> li = ['pwd=secret', 'database=master', 'uid=sa', 'server=mpilgrim']
>>> s = ";".join(li)
>>> s
'pwd=secret;database=master;uid=sa;server=mpilgrim'
>>> s.split(";")                                                     #(1)
['pwd=secret', 'database=master', 'uid=sa', 'server=mpilgrim']
>>> s.split(";", 1)                                                  #(2)
['pwd=secret', 'database=master;uid=sa;server=mpilgrim']
  1. split, przeciwieństwo funkcji join, dzieli łańcuch znaków na wieloelementową listę. Separator (w przykładzie ";") nie będzie występował w żadnym elemencie zwracanej listy, zostanie pominięty.
  2. Do funkcji split możemy dodać opcjonalny drugi argument, który określa, na jaką maksymalną liczbę kawałków ma zostać podzielony łańcuch. (O opcjonalnych argumentach w funkcji dowiemy się w następnym rozdziale.)


Porada tekst.split(separator, 1) jest przydatnym sposobem dzielenia łańcucha na dwa fragmenty.

Pierwszy fragment dotyczy łańcucha znajdującego się przed pierwszym wystąpieniem separatora (jest on pierwszym elementem zwracanej listy), a drugi fragment zawiera dalszy fragment łańcucha znajdującego się za pierwszym znalezionym separatorem (jest drugim elementem listy). Dalsze separatory nie są brane pod uwagę.


[edytuj] Materiały dodatkowe