📚

ABC329A - Spreadを題材にアスタリスク演算子とstr.join() メソッドについて解説する試み

に公開

本記事の目標

  • ABC329A - Spreadを題材にアスタリスク演算子とstr.join() メソッドの自分なりの理解を披露すること。
  • より具体的には、該当の問題に対して2つの解き方を提示し、それぞれの解き方で活用されているpythonの機能(アスタリスク演算子とstr.join())を解説すること。

問題

https://atcoder.jp/contests/abc329/tasks/abc329_a

英大文字からなる文字列 S が与えられます。S の各文字を空白で区切り、その順で 1 文字ずつ出力してください。

という問題。要するに、

  • 入力: ABC → 出力: A B C
    という形で出力すればいい。この問題をpython3で解いていく。

ACコード1

アスタリスク演算子(アンバック演算子)を使う方法

s = input()
print(*s)

ACコード2

str.join() メソッドを使う方法

s = input()
print(" ".join(s)) 

ACコード1についての解説

*sというアスタリスク演算子は結論から言えば、sの中身をバラバラにして返すということである。もっと詳しく言えば、sの各要素を個別の引数として展開しているということだ。たとえば次のようなコードがあったとき、

S = "ABC"
print(*S)  # A B C

print(*S)print('A', 'B', 'C')と同じ意味になる。また、print()関数は複数の引数を受け取ると、デフォルトでスペースを区切って返す。(補足1参照)またアスタリスク演算子はイテラブルの要素ならなんでも使える。(イテラブルについては補足2参照)

補足1printのsepバラメータについて

sep=区切り文字のこと。要素と要素の間を区切っている。区切るとは要素の間に特定の文字を入れることをここではさす。
以下のような形になる

# デフォルトでは sep=' ' (空白)
print('A', 'B', 'C')
# 出力: A B C
# 意味: A と B の間、B と C の間に空白を挟む

# sep を変更する
print('A', 'B', 'C', sep='-')
# 出力: A-B-C
# 意味: A と B の間、B と C の間に '-' を挟む

print('A', 'B', 'C', sep='')
# 出力: ABC
# 意味: 何も挟まない(区切りなし)

print('A', 'B', 'C', sep=', ')
# 出力: A, B, C
# 意味: A と B の間、B と C の間に ', ' を挟む

補足2 イテラブルについて

イテラブル (iterable) とは、「要素を1つずつ取り出せるオブジェクト」のことであり、それは「イテラブル」が英語の "iterate"(繰り返す、反復する)から来ていることからもわかる。
おもなpythonのイテラブル

# 文字列
S = "ABC"  # 'A', 'B', 'C' を1つずつ取り出せる

# リスト
L = [1, 2, 3]  # 1, 2, 3 を1つずつ取り出せる

# タプル
T = (10, 20, 30)  # 10, 20, 30 を1つずつ取り出せる

# 辞書
D = {'a': 1, 'b': 2}  # 'a', 'b' を1つずつ取り出せる

# range
R = range(5)  # 0, 1, 2, 3, 4 を1つずつ取り出せる

公式ドキュメント

https://docs.python.org/ja/3/glossary.html#term-iterable

ACコード2についての解説

join()は文字列のメソッドでイテラブルの要素を結合する。構文としては"区切り文字".join(イテラブル)だ。
例えば、下のようなコードの場合

S = "ABC"
print(" ".join(S))  # A B C

" ".join(S)は、Sの各文字を空白で連結した新しい文字列を作る。つまり、内部的には、

"A" + " " + "B" + " " + "C" → "A B C"

結果として一つの文字列を返す。なお、ACコード1との違いは一つの文字列にするという違いがある

おわりに

間違いなどあると思いますのであればコメントお願いします。

Discussion