Łączenie i konkatenacja ciągów w Pythonie: Operatory +, funkcje join itp.

Biznes

Poniżej opisano sposób konkatenacji i łączenia łańcuchów str w języku Python.

  • Konkatenacja i łączenie wielu ciągów znaków: +,+=operator
  • Konkatenacja i łączenie liczb i ciągów znaków: +,+=operator,str(),format(),f-string
  • Konkatenacja i łączenie list (tablic) ciągów znaków w jeden ciąg znaków:join()
  • Konkatenuj i łącz listy (tablice) liczb w jeden ciąg znaków:join(),str()

Konkatenacja i łączenie wielu ciągów znaków: +, +=operator

połączenie: +operator

Operator ++ może być używany do konkatenacji następujących literałów łańcuchowych i zmiennych łańcuchowych

  • '…'
  • „…”
s = 'aaa' + 'bbb' + 'ccc'
print(s)
# aaabbbccc

s1 = 'aaa'
s2 = 'bbb'
s3 = 'ccc'

s = s1 + s2 + s3
print(s)
# aaabbbccc

s = s1 + s2 + s3 + 'ddd'
print(s)
# aaabbbcccddd

połączenie: +=operator

Można również użyć operatora +=, będącego operatorem przypisania kumulatywnego. Zmienna łańcuchowa po lewej stronie jest konkatenowana z łańcuchem po prawej stronie, a następnie przypisywana i aktualizowana.

s1 += s2
print(s1)
# aaabbb

Aby dodać łańcuch do końca zmiennej łańcuchowej, wystarczy przetworzyć zmienną łańcuchową i dowolny dosłowny łańcuch (lub inną zmienną łańcuchową) za pomocą operatora +=.

s = 'aaa'

s += 'xxx'
print(s)
# aaaxxx

Kolejna konkatenacja literałów łańcuchowych

Jeśli po prostu napiszesz obok siebie literały łańcuchowe, zostaną one połączone w jedną całość.

s = 'aaa''bbb''ccc'
print(s)
# aaabbbccc

Dopuszczalne jest umieszczenie spacji między dwoma wierszami lub przerwanie wiersza odwrotnym ukośnikiem (uważane za kontynuację).

s = 'aaa'  'bbb'    'ccc'
print(s)
# aaabbbccc

s = 'aaa'\
    'bbb'\
    'ccc'
print(s)
# aaabbbccc

Istnieje technika pozwalająca wykorzystać to do pisania długich łańcuchów w wielu wierszach kodu.

Ta metoda zapisu nie jest możliwa w przypadku zmiennych łańcuchowych.

# s = s1 s2 s3
# SyntaxError: invalid syntax

Konkatenacja liczb i ciągów znaków: +,+=operator,str(),format(),f-string

Operacja + innego typu powoduje wystąpienie błędu.

s1 = 'aaa'
s2 = 'bbb'

i = 100
f = 0.25

# s = s1 + i
# TypeError: must be str, not int

Jeśli chcesz połączyć wartość liczbową (np. typu całkowitego int lub zmiennoprzecinkowego float) z łańcuchem znaków, przekonwertuj wartość liczbową na typ łańcuchowy za pomocą funkcji str(), a następnie połącz je za pomocą operatora + (lub operatora +=).

s = s1 + '_' + str(i) + '_' + s2 + '_' + str(f)
print(s)
# aaa_100_bbb_0.25

Jeśli chcesz przekonwertować format liczby, np. wypełnienie zera lub miejsca dziesiętne, użyj funkcji format() lub metody łańcuchowej format().

s = s1 + '_' + format(i, '05') + '_' + s2 + '_' + format(f, '.5f')
print(s)
# aaa_00100_bbb_0.25000

s = '{}_{:05}_{}_{:.5f}'.format(s1, i, s2, f)
print(s)
# aaa_00100_bbb_0.25000

Oczywiście możliwe jest również osadzenie wartości zmiennej bezpośrednio w łańcuchu znaków bez formatowania. Jest to prostsze do napisania niż użycie operatora +.

s = '{}_{}_{}_{}'.format(s1, i, s2, f)
print(s)
# aaa_100_bbb_0.25

Szczegółowe informacje na temat określania formatu można znaleźć w poniższym artykule.

Od wersji Pythona 3.6 wprowadzono również mechanizm zwany f-string (f-string), który jest jeszcze prostszy do napisania niż format().

s = f'{s1}_{i:05}_{s2}_{f:.5f}'
print(s)
# aaa_00100_bbb_0.25000

s = f'{s1}_{i}_{s2}_{f}'
print(s)
# aaa_100_bbb_0.25

Konkatenacja i łączenie list (tablic) ciągów znaków: join()

Metoda join() może służyć do łączenia listy ciągów w jeden ciąg.

Poniżej przedstawiono sposób jego zapisu.

'String to be inserted between'.join([List of strings to be concatenated])

Wywołaj metodę join() z 'ciągiem do wstawienia między' i przekaż [listę ciągów do złączenia] jako argument.

Jeśli zostanie użyty pusty łańcuch, to [lista łańcuchów do konkatenacji] zostanie po prostu konkatenowana, jeśli zostanie użyty przecinek, to łańcuchy zostaną rozdzielone przecinkami, a jeśli zostanie użyty znak nowej linii, to każdy element łańcucha zostanie podkreślony nową linią.

l = ['aaa', 'bbb', 'ccc']

s = ''.join(l)
print(s)
# aaabbbccc

s = ','.join(l)
print(s)
# aaa,bbb,ccc

s = '-'.join(l)
print(s)
# aaa-bbb-ccc

s = '\n'.join(l)
print(s)
# aaa
# bbb
# ccc

Chociaż podany jest tu tylko przykład listy, jako argumenty join() można podać również inne obiekty iterowalne, takie jak tuple.

W przeciwieństwie do join(), split() służy do podziału łańcucha ograniczonego określonym ogranicznikiem i uzyskania go w postaci listy.

Konkatenacja i łączenie list (tablic) liczb jako ciągów znaków: join(),str()

Błąd występuje, jeśli argumentem funkcji join() jest lista, której elementy nie są łańcuchami.

l = [0, 1, 2]

# s = '-'.join(l)
# TypeError: sequence item 0: expected str instance, int found

Aby połączyć listę liczb w jeden ciąg znaków, należy zastosować funkcję str() do każdego elementu listy, aby przekształcić liczby w ciąg znaków, a następnie połączyć je za pomocą funkcji join().

s = '-'.join([str(n) for n in l])
print(s)
# 0-1-2

Można je również zapisać jako wyrażenie generatora, które jest generatorową wersją list comprehensions. Wyrażenia generatora są ujęte w nawiasy, ale nawiasy można pominąć, jeśli wyrażenie generatora jest jedynym argumentem funkcji lub metody.

s = '-'.join((str(n) for n in l))
print(s)
# 0-1-2

s = '-'.join(str(n) for n in l)
print(s)
# 0-1-2

Wyrażenia generatorów mają tę zaletę, że zużywają mniej pamięci niż listy, ale nie ma żadnej szczególnej korzyści z używania wyrażeń generatorów, ponieważ join() konwertuje generatory na listy w swoim wewnętrznym przetwarzaniu. W rzeczywistości nieco szybciej jest od początku używać list comprehensions.

Więcej informacji na temat list comprehensions i wyrażeń generatorów można znaleźć w poniższym artykule.