備忘録
- N行の入力の場合
- 【半角スペース区切りでの文字列の分割】5 つの文字列の半角スペース区切りでの分割
- 半角スペース区切りの文字列の入力
- N行の整数の入力
- なぜ input() だけでいいのか?int(input())じゃないの?
N行の入力の場合
for _ in range(1000):
s = input()
print(s)
for文を使って、range()のカッコ内に整数を入れて、for以下で入力を受け取り、printする
【半角スペース区切りでの文字列の分割】5 つの文字列の半角スペース区切りでの分割
texts = "文 字 列"
words = texts.split(" ")
for word in words:
print(word)
①文字列を適当な名前に代入する
②その文字列を変数名 = 文字列の入った変数名.split()でリストにする
③for文で、for 名前 in ②の変数名:としてprintする
半角スペース区切りの文字列の入力
for x in input().split():
print(x)
解説
input()
で標準入力から1行の文字列(例:"a_1 a_2 … a_1000"
)を読み込みます。.split()
によって半角スペース区切りで分割し、1000 個の要素をもつリスト["a_1", "a_2", …, "a_1000"]
を得ます。for x in ...:
でそのリストを先頭から順に取り出し、変数x
に代入してループを回します。print(x)
は自動的に改行を付けて出力するため、結果として1000 行にわたってそれぞれの値が1行ずつ表示されます。
N行の整数の入力
gpt o4 mini high
for _ in range(1000):
print(input())
解説
for _ in range(1000):
range(1000)
で 0 から 999 までの 1,000 回繰り返すループを作ります。- ループ変数を使わない場合は慣例的に
_
を使います。
print(input())
- ループごとに
input()
で標準入力から1行分(a_i
)を文字列として読み込み、 - そのまま
print()
で改行付き出力します。
- ループごとに
これで、1,000 行の入力を受け取り、同じ内容を 1,000 行で出力します。
ここでは入力された値をそのまま「文字列」として出力するだけなので、int()
による数値変換は不要です。
なぜ input() だけでいいのか?int(input())じゃないの?
input()
は「標準入力から1行の文字列」を返します。- 問題の要件は「受け取った値をそのまま改行区切りで出力する」こと。
- つまり、内部で何らかの計算や比較をするわけではなく、
文字列を読み取って文字列を出力するだけなので、
そのまま文字列のまま扱ったほうがシンプルです。
for _ in range(1000):
s = input() # s は "123" のような文字列
print(s) # そのまま "123" として出力
もしここで int(s)
をしてしまうと、
- 一度文字列 → 整数 に変換し、
- print するときにはまた
str()
を内部的に呼んで文字列に戻す、
という余計な処理が入ってしまいます。
int() が必要なとき
一方、次のような場合は int()
が必要です:
- 数値として足し算/引き算 をする
- 大小比較 を行う
- リストのインデックス に使う など
x = int(input())
y = int(input())
print(x + y) # 足し算をしたいから int() が必要
まとめ
- そのまま入力を「文字列」として出力するだけ →
input()
だけで十分 - 数値として扱って何か計算/比較をする →
int(input())
が必要
今回の問題は前者なので、input()
のみで正解です!
整数の半角スペース区切りの入力
for a in input().split():
print(a)
解説gpt o4 mini high
input()
- 標準入力から1行分の文字列(例:
"10 20 30 … 1000"
)を読み込みます。
- 標準入力から1行分の文字列(例:
.split()
- 読み込んだ文字列を半角スペース区切りで分割し、リストにします。
- 例:
"10 20 30".split()
→["10", "20", "30"]
for a in ...:
- 生成されたリストの要素を先頭から順に取り出し、変数
a
に代入してループします。 - 要素数は必ず 1000 個なので、ループは 1000 回実行されます。
- 生成されたリストの要素を先頭から順に取り出し、変数
print(a)
- ループごとに
a
の値を出力し、自動で改行が付きます。 - 結果として、入力された 1000 個の整数がそれぞれ1行ずつ表示されます。
- ループごとに
一行目で与えられるN個の整数の入力
_, *a = input().split()
for x in a:
print(x)
解説
input().split()
- 標準入力から1行分を読み込み、半角スペースで分割してリスト化します。
- 例:
"5 8 1 3 1 3".split()
→["5", "8", "1", "3", "1", "3"]
_, *a = …
- リストの最初の要素(
"5"
)を_
(使わない変数)に、 - 残りの要素(
["8", "1", "3", "1", "3"]
)をリストa
に格納します。
- リストの最初の要素(
for x in a:
a
の各要素を順に取り出してループします。
print(x)
- ループごとに
x
(文字列のまま)を出力し、改行します。 - その結果、
8 1 3 1 3
のようにa_1
からa_N
が改行区切りで表示されます。
- ループごとに
*aとは?
*a
は、「アンパック(unpack)」のときに残りの要素すべてをリストにまとめて受け取るための書き方です。
_, *a = ["5", "8", "1", "3", "1", "3"]
# _ = "5"
# a = ["8", "1", "3", "1", "3"]
なぜ _, a = … ではダメなのか?
_, a = ["5", "8", "1", "3", "1", "3"]
- こちらは 「リストの長さがちょうど 2 つ」 という前提でしか動きません。
- 上の例のように要素が 6 個あると、Python は「アンパックすべき要素数が合わない!」とエラーを出します。
ValueError: too many values to unpack (expected 2)
まとめると
_, *a = …
→ 最初の1つは_
に、残りのすべてはリストa
にまとめて受け取る。_, a = …
→ リストがちょうど 2 要素のときだけ、「最初を_
」「2番目をa
」として受け取る。
要素数がそれ以外だとアンパックエラーになる。
N
と続く N
個の値を一度にアンパックするときは、必ず *rest
(ここでは *a
) を使って「残りすべて」を受け取るようにしましょう。
一行目で与えられるN個の文字列の入力
解法①
_, *a = input().split(" ")
for i in a:
print(i)
一行目で与えられるN個の実数の入力
_, *a = input().split()
for x in a:
print(x)
解説
input().split()
- 1行目をまとめて読み込み、半角スペースで分割してリスト化します。
- たとえば入力が
3 0.123 4.560 7.890
なら["3", "0.123", "4.560", "7.890"]
となります。
_, *a = …
- アンパックして、最初の要素(
"3"
)を_
に、 - 残り(
["0.123", "4.560", "7.890"]
)をリストa
に格納します。 _
は「使わない値」を受け取る慣例の変数名です。
- アンパックして、最初の要素(
for x in a:
- リスト
a
の各要素を順にx
に取り出してループします。
- リスト
print(x)
- ループごとに
x
(元の文字列のまま)を出力し、自動的に改行されます。 - これにより、実数
a_1
からa_N
がそれぞれ 1 行ずつ、そのままの表記で出力されます。
- ループごとに
N 組の整数の入力 Python3編
n = int(input())
for _ in range(n):
print(input())
解説
n = int(input())
- 1行目から整数
N
を読み取り、int()
で整数に変換して変数n
に格納します。
- 1行目から整数
for _ in range(n):
range(n)
で 0 からn-1
までの整数を生成し、合計でn
回ループします。- ループ変数を使わないときは慣例的に
_
を用います。
print(input())
- ループの各回で
input()
によって次の行(a_i b_i
の文字列)をそのまま読み込み、 print()
で改行付き出力します。
- ループの各回で
これにより、入力された a_1 b_1
から a_N b_N
までを、同じ順序で改行区切りの行として出力できます。
「整数の組からの選択 Python3編」
n = int(input())
for i in range(1, n + 1):
s, a = input().split()
if i == 8:
print(s, a)
解説
n = int(input())
- 1行目の入力を文字列として受け取り、
int()
で整数に変換してn
に格納します。 - これが「組数 N」を表します(ただし今回の処理では実際に
n
を直接は使いません)。
- 1行目の入力を文字列として受け取り、
for i in range(1, n + 1):
range(1, n + 1)
で1
からn
までの連番を生成し、- ループ変数
i
に「現在何行目か」を代入しながら繰り返します。
s, a = input().split()
- 各ループで 2 行目以降の入力行(例:
"Goblin 150"
) をinput()
で読み込み、 .split()
で空白区切りに分割して、- 左側の文字列部分を
s
に、 - 右側の整数部分を文字列のまま
a
に格納します。
- 左側の文字列部分を
- 各ループで 2 行目以降の入力行(例:
if i == 8:
- ループの8回目(8組目の入力行)だけを対象とする条件です。
print(s, a)
- 条件に合致したとき(i が 8 のとき)に、
- 変数
s
とa
をスペース区切りで出力します。 - これで「8 組目の
s_8 a_8
」だけが出力されます。
文字列と整数の組の入力 Python3編
n = int(input())
for _ in range(n):
s, a = input().split()
print(s, a)
解説
n = int(input())
- 1行目の整数
N
を読み込み、int()
で整数に変換して変数n
に格納します。
- 1行目の整数
for _ in range(n):
range(n)
で0
からn-1
までの整数を生成し、合計n
回ループします。- ループ変数を使わないときは慣例的に
_
を使います。
s, a = input().split()
- 各ループで次の行(例:
"Goblin 150"
) をinput()
で読み込み、 .split()
で半角スペース区切りに分割します。- 返ってきたリストの最初の要素を
s
、次の要素をa
にそれぞれ代入します。
- 各ループで次の行(例:
print(s, a)
- 変数
s
とa
をスペース区切りでそのまま出力します。 print
のデフォルト区切り文字がスペースなので、期待通りの"s_i a_i"
の形式で出力されます。
- 変数
この処理を N
回行うことで、入力された s_1 a_1
から s_N a_N
までを改行区切りで順に出力できます。
【組になったデータの入力】文字列と整数の組からの選択 Python3編
n = int(input()) # 1行目の整数 N を読み込んで変数 n に格納
for i in range(1, n + 1): # 1 から N までの番号 i を順にループ
s, a = input().split() # それぞれの行から文字列 s_i と整数 a_i を読み込む
if i == 8: # 「8組目」だけを条件判定
print(s, a) # s_8 と a_8 をスペース区切りで出力
解説
n = int(input())
- 1行目に与えられる整数 N を文字列で受け取り、
int()
で整数に変換してn
に保存します。
- 1行目に与えられる整数 N を文字列で受け取り、
for i in range(1, n + 1):
range(1, n + 1)
で 1, 2, …, N の連番を生成し、ループ変数i
に代入しながら N 回繰り返します。
s, a = input().split()
- 各ループで 2 行目以降の入力(例:
"Goblin 150"
)をinput()
で読み込み、 .split()
で空白区切りに分割して、最初の文字列部分をs
、次の数値部分を文字列のままa
に代入します。
- 各ループで 2 行目以降の入力(例:
if i == 8:
- ループ回数が「8」になったときだけ内部の処理を行います。
print(s, a)
- 8組目の
s
とa
をスペース区切りで出力し、自動的に改行が入ります。
- 8組目の
これによって、必ず入力の 8組目 のペアだけが出力されます。
3 行 3 列の整数の入力 Python3編
解法①
for _ in range(3):
print(input())
解法②(paiza 解答コード例)
a = []
for i in range(3):
a_i = list(map(int, input().split()))
a.append(a_i)
for i in range(3):
print(*a[i])
a = []
- 空のリスト
a
を準備しています。 - ここに「行列の各行」をリストとして順番に格納していきます。
- 空のリスト
for i in range(3):
range(3)
によって0, 1, 2
の3回ループします。- このループが「行列の行を3行分」読み込む部分です。
input().split()
- 標準入力から1行読み込み(例えば
"1 2 3"
)、 .split()
で空白ごとに分割し、文字列のリスト["1", "2", "3"]
を得ます。
- 標準入力から1行読み込み(例えば
map(int, …)
→list(...)
map(int, ["1","2","3"])
によって要素を整数に変換し、list(...)
でそれをリスト化して[1, 2, 3]
とします。- このリストを変数
a_i
に代入。
a.append(a_i)
- 先ほど作った
[1, 2, 3]
のような「1行分のリスト」を、 - 全体リスト
a
の末尾に追加します。 - こうしてループが終わると、
a == [ [a_{1,1}, a_{1,2}, a_{1,3}], [a_{2,1}, a_{2,2}, a_{2,3}], [a_{3,1}, a_{3,2}, a_{3,3}], ]
という形で 3×3 の行列データが格納されます。
- 先ほど作った
for i in range(3):
- 再び 3 回ループして、
a
に格納された各行を順に取り出します。
- 再び 3 回ループして、
print(*a[i])
a[i]
は先ほど格納した各行(例:[1, 2, 3]
)を表します。*a[i]
はリストのアンパック(展開)で、print(1, 2, 3)
と同じ意味になります。print
は複数引数を半角スペース区切りで出力するので、1 2 3
のように行が再現されます。
まとめ
- 最初のループで「行を読んで→整数リスト化→全体リスト
a
に格納」 - 次のループで「
a
から行を取り出して→アンパック→そのままスペース区切り出力」
これによって、与えられた 3×3 行列を入力どおりにそのまま出力できます。
Thought for a second
map
関数 は、イテラブル(リストやタプルなど) の各要素に同じ処理(関数)をまとめて適用したいときに使う組み込みの高階関数です。
基本的な書式
map(関数, イテラブル)
- 関数: ひとつの引数を取り、何らかの処理をして結果を返す関数(
int
,str.upper
など)。 - イテラブル:
list
,tuple
,map
など、「順に要素を取り出せるオブジェクト」。
戻り値は イテレータ(Python 3 の場合)。必要に応じて list(...)
や tuple(...)
でリストやタプルに変換して使います。
何をするもの?
- イテラブルの要素を「関数に渡して一括変換」 する。
- 例えば文字列のリストを整数のリストに変換したり、
- 小文字の文字列を大文字に変換したり、
- オブジェクトの属性だけを取り出す関数をかけたり…
といったときに便利です。
よくある使用例
1. 文字列を整数に変換
line = "10 20 30"
parts = line.split() # ["10", "20", "30"]
nums = list(map(int, parts)) # [10, 20, 30]
parts
の各要素をint("10")
,int("20")
,int("30")
とまとめて変換。
2. ファイルの各行をストリップ(前後の空白除去)
lines = [" apple\n", "banana \n", " cherry "]
clean = list(map(str.strip, lines))
# ["apple", "banana", "cherry"]
3. オブジェクトの属性を抜き出す
class Person:
def __init__(self, name):
self.name = name
people = [Person("Alice"), Person("Bob"), Person("Carol")]
names = list(map(lambda p: p.name, people))
# ["Alice", "Bob", "Carol"]
なぜ便利?
- ループと代入を一行で書ける
- 処理内容がすっきりして「何をしたいか」が明確に見える
- 大量データでも内部的に最適化されたイテレータとして動く
まとめ
- 目的: イテラブルの各要素に同じ関数を適用する
- 使いどころ: データ型の一括変換や、要素からの属性抽出など
- 戻り値: Python 3 ではイテレータ(必要に応じて
list()
でリスト化)
3 行 M 列の整数の入力 Python3編
GPT o4-mini-high
m = int(input()) # 1 行目の整数 M を読み込んで変数 m に格納
for _ in range(3): # 3 回繰り返して 3 行分を読み込む
row = input().split() # 半角スペース区切りで各行を分割し、リストにする
print(*row) # アンパックしてスペース区切りでそのまま出力
解説
m = int(input())
- 1 行目に与えられる列数 M を文字列で読み込み、
int()
で整数に変換して変数m
に保存します。 - 以降の処理では行数(3 行)が固定なので、
m
自体は「列数が何個あるか」のチェックやリスト操作時の目安になります。
- 1 行目に与えられる列数 M を文字列で読み込み、
for _ in range(3):
- 3 行分のデータを読み込むループを作ります。
range(3)
→ 0, 1, 2 の 3 回繰り返し、各回で 1 行ずつ処理します。- ループ変数を使わない場合は慣例的に
_
と書きます。
row = input().split()
- 各ループで、標準入力から次の行を文字列として読み込み、
.split()
によって半角スペース区切りで分割し、M 個の要素を持つリストrow
にします。
print(*row)
- リスト
row
の要素を*row
でアンパックし、 print
の複数引数(デフォルト区切り文字はスペース)として渡すことで、- 元の行と同じく スペース区切り の形で出力します。
- リスト
このように、読み込んだ 3 行 × M 列 の行列データを、そのまま同じ形式で再表示できます。
N 行 M 列の整数の入力 Python3編
Thought for a second
n, m = map(int, input().split()) # 1行目から N(行数)と M(列数)を読み込んで整数に変換
for _ in range(n): # N 行分のループ
row = input().split() # 各行を空白区切りで分割してリスト化(M 個の文字列が入る)
print(*row) # リストをアンパックしてスペース区切りで出力
解説
n, m = map(int, input().split())
input().split()
で["N", "M"]
の文字列リストを得て、map(int, ...)
でそれぞれをint("N")
,int("M")
と整数に変換し、n
に行数、m
に列数を格納します。
for _ in range(n):
range(n)
は0
からn-1
までの整数を生成し、合計でn
回ループします。- ループ変数を使わないので慣例的に
_
を使っています。
row = input().split()
- 各ループで標準入力から1行を読み込み、
.split()
によって半角スペース区切りで分割し、M 個の文字列を要素に持つリストrow
を作ります。
print(*row)
*row
でリストの要素をアンパックし、print
に複数引数として渡します(デフォルトの区切り文字はスペース)。- これにより、元の行と同じ M 列スペース区切り の形式で出力できます。
これで、入力された N 行 M 列 の行列をそのまま同じフォーマットで再表示します。
【N 行 M 列のデータの入力】行ごとに要素数の異なる整数列の入力 Python3編
Thought for a few seconds
n = int(input()) # 1行目の整数 N を読み込んで行数を取得
for _ in range(n): # N 回ループして各行を処理
parts = input().split() # 「M_i a_{i,1} … a_{i,M_i}」を空白で分割
# parts[0] は M_i(列数)なのでスキップして、残りを出力
print(*parts[1:])
解説
n = int(input())
- 標準入力の1行目から文字列を読み込んで
int()
によって整数化し、変数n
に格納します。 - この
n
が「続く何行を処理するか」の行数です。
- 標準入力の1行目から文字列を読み込んで
for _ in range(n):
range(n)
は0
からn-1
までの整数シーケンスを生成し、合計n
回の繰り返しを行います。- ループ変数を使わないので慣例的に
_
と書いています。
parts = input().split()
- 各ループで、次の行(例:
"4 10 20 30 40"
) をinput()
で読み込み、 .split()
を使って半角スペース区切りで分割し、文字列リストparts
を作ります。- ここで
parts[0]
が列数M_i
、parts[1:]
が実際のデータa_{i,1}
〜a_{i,M_i}
です。
- 各ループで、次の行(例:
print(*parts[1:])
parts[1:]
で「列数」を除いた後半の要素リストをスライスで取得し、*
(アンパック)を使ってprint
の複数引数として渡します。print
のデフォルト区切り文字はスペースなので、元の行にあるようにスペース区切りで出力されます。
これで、各行に最初に付いている列数を除いたデータだけがそのまま N 行出力されます。
GPT o4-mini-high
1. スライス(slice)とは?
- Python のシーケンス(
list
,tuple
, 文字列 など)から、部分的に取り出して新しいシーケンスを作る操作です。 - 構文は
シーケンス[開始:終了]
やシーケンス[開始:終了:ステップ]
のように書きます。 開始
から終了-1
までの要素を抜き出す開始
を省略すると先頭から、終了
を省略すると末尾までステップ
を省略すると 1(隣接要素)ずつ取り出す- 例:
lst = [0, 1, 2, 3, 4, 5]
lst[2:5] # → [2, 3, 4] (index 2,3,4)
lst[:3] # → [0, 1, 2] (先頭から index 0,1,2)
lst[3:] # → [3, 4, 5] (index 3 以降すべて)
lst[::2] # → [0, 2, 4] (0→2→4 と2つ飛ばし)
2. なぜ print(parts[1:])
ではダメで、アンパック(*
)が必要?
parts[1:]
は リスト(例:["10", "20", "30"]
)なので、
print(parts[1:])
とすると、Python のリスト表記そのまま
['10', '20', '30']
のように 角括弧 や 引用符 付きで出力されてしまいます。
- 一方アンパック
*parts[1:]
を使うと、リストの各要素を 個別の引数 としてprint()
に渡せます。
print(*parts[1:]) # → 10 20 30
print
のデフォルト引数sep=" "
によって、各要素がスペース区切りになり- 余計な括弧や引用符なし で、元の行列フォーマットどおりに表示できる、というわけです。
まとめ
- スライス で部分的なリストを取り出し、
- アンパック(
*
) でリストを展開してprint
に渡すことで、見た目もきれいに出力できます。
コメント