Time Limit: 0 msec / Memory Limit: 0 KB
キーポイント
"
(二重引用符)や'
(一重引用符)で囲んで文字列を作るlen(s)
で文字列 s の長さを得られるs[i]
で文字列 s の i 文字目を得られるs + t
で文字列 s, t を連結できる- 文字列は変更不可能。一部を変更したいときは、文字のリストを作る
文字列
Hello
や ABCDEFG
や あいうえお
のようなテキスト(文字の並び)のことを 文字列 と言います。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 + t
で s, t をこの順に連結した文字列を作ることができます。 - 文字列 s と非負整数 n に対し、
s * n
で s を n 回繰り返した文字列を作ることができます。
# "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]
で s の i 番目の文字を取得できます。 - リストのときと同様に、負の添字やスライスを使うことができます。
# 文字列 "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 の連続する一部分のことです。部分文字列とは?
例えば、空文字列、A
、BC
、ABC
は ABC
の部分文字列ですが、D
や AC
は ABC
の部分文字列ではありません。
- 文字列 s, t に対し、
t in s
で s の部分文字列に 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 != t
で s と t が同じ文字列であるかを判定できます。 - 文字列 s, t に対し、
s < t
/s <= t
/s > t
/s >= t
で s と t を辞書式順序で比較できます。
大文字・小文字かどうか判定する
- 文字列 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
問題
リンク先の問題を解いてください。