{ }codelper
内包表記2次元リストP0083

表を転置してふるい分ける

r 行 c 列の整数の表が与えられる。
ループの代わりに内包表記で次の三つを作って出力せよ。
1) 転置した表:元の表の j 列目(上から下へ)が新しい表の j 行目になる。
c 行にわたり、1 行に r 個ずつ空白一つで区切って出力する。
2) 3 の倍数の二乗:表を上の行から、行の中では左から読み、3 の倍数(0 と負の数を含む)だけを選んで二乗する。
選んだ個数 k を先に書き、続けて二乗した値 k 個を読んだ順に、1 行に空白で区切って出力する。
一つもなければ 0 だけを出力する。
3) 表に現れる異なる値の個数を出力する。

入力
1 行目に r c、続く r 行に整数 c 個ずつ。
1 ≤ r, c ≤ 50、-1000 ≤ 値 ≤ 1000
出力
転置した表 c 行、次の行に k と二乗 k 個、最後の行に異なる値の個数
例 1 · stdin
2 3
1 3 -6
4 9 3
stdout
1 4
3 9
-6 3
4 9 36 81 9
5
main.py
入力(stdin)

実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。

$ 準備完了

コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。

ほかの言語では?言語別の解答を見る · 1 言語の解答

この問題は Python だけを受け付けます。
リスト・集合の内包表記は Python の文法で、ほかの言語は同じことをループや map・filter(JS)、ストリーム(Java)、LINQ(C#)で行います。
内包表記の中の for は、ループを重ねて書くときと同じ順に並べます:[x * x for row in grid for x in row if x % 3 == 0] は外側の for row が先です。
順を入れ替えて列から回ると、平らにする順番が変わります。
転置は内包表記を重ねた [[row[j] for row in grid] for j in range(c)](または zip(*grid))で、[[0] * r] * c で先にマスを作ると同じ行が c 回入り、すべての行が同じになります。
角かっこの代わりに丸かっこの (x for row in grid for x in row) はジェネレーターなので、一度使い切ると二回目は空です(異なる値が 0 個になります)。
Python では -6 % 3 が 0 なので、負の倍数もそのまま選ばれます。
Craykon なら それぞれ (x の中 row) のループと 追加 で作ります。

Pythonmain.py · 14 行
r, c = map(int, input().split())grid = [[int(x) for x in input().split()] for _ in range(r)] # 1) 뒤집기: 열 j를 줄로 — 바깥 내포가 새 줄, 안쪽 내포가 그 줄의 칸flipped = [[row[j] for row in grid] for j in range(c)]for line in flipped:    print(" ".join(str(x) for x in line)) # 2) 펼치며 거르기: for를 읽는 차례(위 줄 → 그 줄의 칸) 그대로 적는다squares = [x * x for row in grid for x in row if x % 3 == 0]print(len(squares), *squares) # 3) 집합 내포: 서로 다른 값의 개수print(len({x for row in grid for x in row}))