{ }codelper
推导式二维列表P0083

转置并筛选表格

给定一个 r 行 c 列的整数表。
不用循环,而用推导式构造并输出下面三样东西。
1) 转置后的表:原表的第 j 列(从上到下)成为新表的第 j 行。
输出 c 行,每行 r 个数,用一个空格分隔。
2) 3 的倍数的平方:从最上面一行开始、每行从左到右读表,只挑出 3 的倍数(包括 0 和负数)并求平方。
先写挑出的个数 k,再按读到的顺序写出 k 个平方,都在一行内用空格分隔。
一个都没有时只输出 0。
3) 输出表中不同值的个数。

输入
第一行 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}))