L - 1.11.文字列 Editorial /

Time Limit: 0 msec / Memory Limit: 0 KB

前のページ | 次のページ

キーポイント

  • "(二重引用符)や '(一重引用符)で囲んで文字列を作る
  • len(s) で文字列 s の長さを得られる
  • s[i] で文字列 si 文字目を得られる
  • s + t で文字列 s, t を連結できる
  • 文字列は変更不可能。一部を変更したいときは、文字のリストを作る

文字列

HelloABCDEFGあいうえお のようなテキスト(文字の並び)のことを 文字列 と言います。Python では、str 型(文字列型) を使って文字列を扱います。例えば、以下のようなプログラムを書くことができます。

# 文字列 "ABCDEFG" を作り a に代入
a = "ABCDEFG"

# 文字列 a の 0 番目の文字 "A" を出力
print(a[0])

# 入力から 1 行読み取って文字列を作り b に代入
b = input()

# 文字列 a, 空白, 文字列 b をつなげた文字列を作り出力
print(a + " " + b)
入力
あいうえお
出力
A
ABCDEFG あいうえお

本章では、この文字列の使い方について説明します。

文字列を作る

  • "(二重引用符)や '(一重引用符)で囲んだ部分が文字列として扱われます。どちらを使っても違いはありません。
# 文字列 "Hello" を作り a に代入
a = "Hello"

# 文字列 "AtCoder" を作り b に代入
b = 'AtCoder'

エスケープシーケンス

通常、以下のように文字列の中に改行をそのまま書くことはできません。

# 文字列の中に改行を入れたい
s = "Hello
AtCoder"
文法エラー
  File "Main.py", line 2
    s = "Hello
        ^^^^^^
SyntaxError: unterminated string literal (detected at line 2)
(訳)文法エラー: 終端のない文字列リテラル (2 行目で検出)

このような文法上意味のある文字を文字列に入れたい場合、\(バックスラッシュ)から始まる エスケープシーケンス を利用します。主なエスケープシーケンスは以下の通りです。

エスケープシーケンス 意味
\n 改行文字
\" "(二重引用符)
\' '(一重引用符)
\\ \(バックスラッシュ)
\t 水平タブ
# 文字列の中に改行文字を入れるには \n と書く
print("Hello\nAtCoder")

# 二重引用符で囲まれた文字列の中で二重引用符を入れるには \" と書く
# 文字列の中にバックスラッシュを入れるには \\ と書く
print("\"Hello\\nAtCoder\"")
出力
Hello
AtCoder
"Hello\nAtCoder"

文字列の長さ

  • 文字列 s に対し、len(s)s の長さ(文字数)を取得できます。

for 文で文字列の中の文字を列挙する

  • 文字列 s に対し、for x in s:s の中の文字を順に x に代入して繰り返し処理を行うことができます。
s = "AtCoder"
for x in s:
    print(x)
出力
A
t
C
o
d
e
r

入力から文字列を作る

  • input() で入力から 1 行読み取って文字列を作ることができます。

文字列を出力する

  • 文字列 s に対し、print(s)s を出力することができます。
# 入力から 1 行読み取り、そのまま出力する
print(input())
入力
Hello, AtCoder!
出力
Hello, AtCoder!

文字列をつなげる

  • 文字列 s, t に対し、s + ts, t をこの順に連結した文字列を作ることができます。
  • 文字列 s と非負整数 n に対し、s * nsn 回繰り返した文字列を作ることができます。
# "ABC" と "123" をつなげた文字列 "ABC123" を出力する
print("ABC" + "123")

# "ABC" を 3 回繰り返した文字列 "ABCABCABC" を出力する
print("ABC" * 3)
出力
ABC123
ABCABCABC

文字列を整数に変換する

  • 文字列 s に対し、int(s)s を整数に変換することができます。

整数を文字列に変換する

  • 整数 x に対し、str(x)x を文字列に変換することができます。
# 999999999999999999999999999999 + 1 を出力
print(int("9" * 30) + 1)

# 3 ** 1000 の桁数を出力
print(len(str(3 ** 1000)))
出力
1000000000000000000000000000000
478

整数・文字列変換における桁数制限

整数から文字列への変換、文字列から整数への変換において、変換に時間がかかることを防ぐため、4300 桁よりも大きな数は変換できないようになっています。整数を出力するときにも整数から文字列への変換が行われるので、この制限が適用されます。

print(10 ** 4300)
エラー出力
Traceback (most recent call last):
  File "/judge/Main.py", line 1, in <module>
    print(10 ** 4300)
ValueError: Exceeds the limit (4300) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit
(訳) 値エラー: 整数・文字列変換における上限 (4300) を超えています; 上限を増やすには sys.set_int_max_str_digits() を使ってください

sys.set_int_max_str_digits(0) を実行することで、この制限を取り除くことができます。

import sys
sys.set_int_max_str_digits(0)

print(10 ** 4300)
出力
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

文字列を空白文字で区切る

  • 文字列 s に対し、s.split()s を空白文字で区切って文字列のリストを作ることができます。

文字列のリストを連結する

  • 文字列 s と文字列のリスト a に対し、s.join(a)s を区切り文字列として a の各要素を連結することができます。
# "1 23 456" を空白文字で区切り、リスト ["1", "23", "456"] を作る
a = "1 23 456".split()

# ["1", "23", "456"] を文字列 " + " で結合してできる文字列 "1 + 23 + 456" を出力する
print(" + ".join(a))
出力
1 + 23 + 456

文字列の i 番目の文字

  • 文字列 s と整数 i に対し、s[i]si 番目の文字を取得できます。
  • リストのときと同様に、負の添字やスライスを使うことができます。
# 文字列 "ABCDE" を作り s に代入する
s = "ABCDE"

# s の 0 番目の文字 "A" を出力する
print(s[0])

# s の最後の文字 "E" を出力する
print(s[-1])

# s の 1 番目から 3 番目までの文字列 "BCD" を出力する
print(s[1:4])

# s を逆順にした文字列 "EDCBA" を出力する
print(s[::-1])
出力
A
E
BCD
EDCBA

部分文字列に x があるか調べる

部分文字列とは?

文字列 s の部分文字列とは、s連続する一部分のことです。
例えば、空文字列、ABCABCABC の部分文字列ですが、DACABC の部分文字列ではありません。

  • 文字列 s, t に対し、t in ss の部分文字列に t が含まれるかどうか判定することができます。
  • 文字列 s, t に対し、s.index(t)s に現れる最初の部分文字列 t の位置を求めることができます。
  • 文字列 s, t に対し、s.count(t)s に部分文字列 t が重ならずに何回出現するかを求めることができます。
# 文字列 "ABABABA" を作り s に代入する
s = "ABABABA"

# "ABABABA" の部分文字列に "BAB" があるか判定する
print("BAB" in s)

# "ABABABA" に現れる最初の部分文字列 "BAB" の位置を求める
# s[1:4] が最初の "BAB" なので、1 を出力する
print(s.index("BAB"))

# "ABABABA" に重ならずに現れる部分文字列 "BAB" の個数を求める
# s[1:4] と s[3:6] が "BAB" であるが、重ならずに取れるのは 1 個までなので、1 を出力する
print(s.count("BAB"))

# "AAAAAAAAAA" (A が 10 個) から重ならずに取れる "AAA" は 3 個まで
print("AAAAAAAAAA".count("AAA"))
出力
True
1
1
3

部分文字列を置換する

  • 文字列 s, t, u に対し、s.replace(t, u)s に重ならずに出現する部分文字列 t をすべて u に置き換えた文字列を取得できます。
# "1 + 2 + 3" に出現する "+" を "**" に置き換えた文字列 "1 ** 2 ** 3" を出力する
print("1 + 2 + 3".replace("+", "**"))

# "AAAAA" に出現する "AA" を "X" に置き換えた文字列 "XXA" を出力する
print("AAAAA".replace("AA", "X"))
出力
1 ** 2 ** 3
XXA

文字列を比較する

  • 文字列 s, t に対し、s == t / s != tst が同じ文字列であるかを判定できます。
  • 文字列 s, t に対し、s < t / s <= t / s > t / s >= tst を辞書式順序で比較できます。

大文字・小文字かどうか判定する

  • 文字列 s に対し、s.isupper()s の文字がすべて大文字かどうか判定することができます。
    • より正確には、s.isupper()s に大文字が含まれていて、小文字が含まれないとき True を返します。
  • 文字列 s に対し、s.islower()s の文字がすべて小文字かどうか判定することができます。
    • より正確には、s.islower()s に小文字が含まれていて、大文字が含まれないとき True を返します。
# "ATCODER" はすべて大文字からなるので、"ATCODER".isupper() は True 
print("ATCODER".isupper())

# "atcoder" はすべて小文字からなるので、"atcoder".islower() は True 
print("atcoder".islower())

# 空文字列には小文字が含まれないので、"".islower() は False
print("".islower())
出力
True
True
False

数字かどうか判定する

  • 文字列 s に対し、s.isdigit()s が空でなく、s の文字がすべて数字かどうか判定することができます。
# "0123456789" は数字のみからなるので、"0123456789".isdigit() は True
print("0123456789".isdigit())

# "ABC123" には数字ではない文字が含まれるので、"ABC123".isdigit() は False
print("ABC123".isdigit())

# "".isdigit() は False
print("".isdigit())
出力
True
False
False

大文字・小文字に変換する

  • 文字列 s に対し、s.upper()s の小文字をすべて大文字に変換した文字列を取得できます。
  • 文字列 s に対し、s.lower()s の大文字をすべて小文字に変換した文字列を取得できます。
# "AtCoder" の小文字をすべて大文字に変換した文字列 "ATCODER" を出力
print("AtCoder".upper())

# "AtCoder" の大文字をすべて小文字に変換した文字列 "atcoder" を出力
print("AtCoder".lower())
出力
ATCODER
atcoder

文字列の一部を変更する

Python の文字列は 一度作ると変更することができません。 文字列の一部を変更したい場合は、一度文字のリストに変換する必要があります。

# 文字列 "AtCoder" を作り s に代入する
s = "AtCoder"

# s は for 文に入れられるものであるから、list(s) で
# リスト ["A", "t", "C", "o", "d", "e", "r"] を作れる
a = list(s)

# a の 0 番目の要素を "M" に変更する
a[0] = "M"

# a の要素をつなげて出力する
print("".join(a))
出力
MtCoder

文字

Python では、1 つの文字は長さ 1 の文字列として str 型で表現されます。 したがって、文字列から取り出した「文字」に対しても文字列に対するさまざまな機能を使うことができます。

# 文字列 "0123456789" の 0 番目の文字 "0" を c に代入
c = "0123456789"[0]

# c は長さ 1 の文字列である
print(len(c))

# c.isdigit() で "0" が数字であるか判定する
print(c.isdigit())

# int(c) で整数に変換できる
print(int(c))
出力
1
True
0

文字をコードポイントに変換する

  • 文字 c に対し、ord(c)c の Unicode コードポイントを取得できます。

コードポイントを文字に変換する

  • 整数 x に対し、chr(x) で Unicode コードポイントが x である文字を取得できます。

Unicode とは

様々な文字に番号を割り当て、文字を番号で管理できるようにしたものを 文字コード と言います。文字コードにおいて、ある文字に割り当てられた番号を コードポイント と言います。
Unicode とは、世界中のあらゆる文字に番号を割り当てた文字コードの規格で、Python の内部でも用いられています。

# 文字 "0" に割り当てられた Unicode コードポイントは 48
print(ord("0"))

# 文字 "a" に割り当てられた Unicode コードポイントは 97
print(ord("a"))

# 文字 "あ" に割り当てられた Unicode コードポイントは 12354
print(ord("あ"))

# Unicode コードポイントが 12354 である文字 "あ" を出力する
print(chr(12354))
出力
48
97
12354
あ

競技プログラミングにおいては、どのような環境でも扱うことのできる ASCII 印字可能文字 の部分しか基本的に使われません。文字コードについては、以下のことを覚えれば十分でしょう。

  • 0, 1, 2, ..., 9 のコードポイントが連続している。(48 – 57)
  • A, B, C, ..., Z のコードポイントが連続している。(65 – 90)
  • a, b, c, ..., z のコードポイントが連続している。(97 – 122)

したがって、以下のようなコードを書くことができます。

  • 英大文字 c に対して、ord(c) - ord("A") と書けば、c が何番目のアルファベットであるかがわかる。
  • 逆に、i 番目のアルファベットを得るには、chr(ord("A") + i) と書く。
  • 文字 c に対して,ord("A") <= ord(c) <= ord("Z") と書けば、c が英大文字であるかどうか判定できる。

公式ドキュメント

より詳しい情報を知りたい場合は、以下の公式ドキュメントを参照してください。

https://docs.python.org/ja/3/library/stdtypes.html#text-sequence-type-str

問題

リンク先の問題を解いてください。