質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1835閲覧

[python]文字絵グリッド

SKMT

総合スコア57

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/03/19 18:17

参考書でパイソンの勉強をしているのですが、その中の演習が解けなくて困っています。

9×6の二次元リストを右に90度回転させ6×9の2次元リストにするというものなのですが
なぜか最後の行になるはずの行が6行表示されてしまいます。計算?はあってると思うので
for文がおかしいのかなと思うのですが直し方がわかりません、、、
どなたかよろしくお願いします

python

1import copy 2grid = [['.','.','.','.','.','.'], 3 ['.','0','0','.','.','.'], 4 ['0','0','0','0','.','.'], 5 ['0','0','0','0','0','.'], 6 ['.','0','0','0','0','0'], 7 ['0','0','0','0','0','.'], 8 ['0','0','0','0','.','.'], 9 ['.','0','0','.','.','.'], 10 ['.','.','.','.','.','.'],] 11 12for i in range(0,8): 13 print(str(grid[i])) 14 15print('') 16 17gridd = [[0]*9]*6 18 19for i in range(0,6): 20 for j in range(0,9): 21 gridd[i][j] = grid[8-j][i] 22 23for i in range(0,5): 24 print(str(gridd[i]))

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

初心者あるあるエラーですね。解決策もそれで正しいです。
慣れないうちはハマりやすいので、リストを作る際は内包表記を優先するのが良いでしょう。
Qiita - pythonでのリストの要素の変更とリストのコピー

せっかくなので、別解もご紹介します。(リストを非対象に変更しました)

Python

1grid = [ 2 ['.', '0', '.', '.', '.', '.'], 3 ['.', '0', '0', '.', '.', '.'], 4 ['0', '0', '0', '0', '.', '.'], 5 ['0', '0', '0', '0', '0', '.'], 6 ['.', '0', '0', '0', '0', '0'], 7 ['0', '0', '0', '0', '0', '.'], 8 ['0', '0', '0', '0', '.', '.'], 9 ['.', '0', '0', '.', '.', '.'], 10 ['.', '.', '.', '.', '.', '.'], 11] 12 13for row in grid: 14 print(*row, sep=' ') 15 16print() 17 18for row in zip(*reversed(grid)): 19 print(*row, sep=' ')

実行結果 Wandbox

plain

1. 0 . . . . 2. 0 0 . . . 30 0 0 0 . . 40 0 0 0 0 . 5. 0 0 0 0 0 60 0 0 0 0 . 70 0 0 0 . . 8. 0 0 . . . 9. . . . . . 10 11. . 0 0 . 0 0 . . 12. 0 0 0 0 0 0 0 0 13. 0 0 0 0 0 0 0 . 14. . 0 0 0 0 0 . . 15. . . 0 0 0 . . . 16. . . . 0 . . . .

コメントを受けて

リスト内包表記
このような[i for i in range(10)]リストの作り方のことです。
覚えていて損することはないので、少しずつ慣れていくと良いと思います。
Qiita - 内包表記を使ってリストの作成を簡潔に書く


論理的な流れ
『右へ90度回転』は、例えば次のどちらかで実現することが可能です。

  • 行列を転置した後、左右を反転させる
  • 上下を反転させた後、行列を転置させる

今回は後者の方法を採用しています。

上下の反転
reversedを用いて実現しています。

Python

1tmp = [ 2 [i*j for j in range(4)] for i in range(4) 3] 4 5for row in tmp: 6 print(*row) 7 8print() 9for row in reversed(tmp): 10 print(*row) 11 12"""標準出力 130 0 0 0 140 1 2 3 150 2 4 6 160 3 6 9 17 180 3 6 9 190 2 4 6 200 1 2 3 210 0 0 0 22"""

転置
zip(各行)を用いて実現しています。

Python

1tmp = [[1, 2], [3, 4]] 2 3for row in tmp: 4 print(row) 5 6print() 7for row in zip([1, 2], [3, 4]): 8 print(row) 9 10print() 11for row in zip(tmp[0], tmp[1]): 12 print(row) 13 14print() 15for row in zip(*tmp): 16 print(row) 17 18"""標準出力 19[1, 2] 20[3, 4] 21 22(1, 3) 23(2, 4) 24 25(1, 3) 26(2, 4) 27 28(1, 3) 29(2, 4) 30"""

アスタリスクの意味
mkgreiさんがコメントされているとおり、アンパックという機能です。
リストやタプルの要素を分解して引数に順番に渡すことを意味します。

私の書いたもので恐縮ですが、Pythonのアスタリスクの機能をまとめた記事です。
Qiita - Python3.xのアスタリスク逆引き

投稿2018/03/19 19:45

編集2018/03/20 05:59
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SKMT

2018/03/19 19:50

内包表記、、?w zip(*reversed(grid))はどうなってるか教えてください!reversedは逆から表示ですよね確か あと*がいろんなとこについてるけどどういう意味があるんですか?
LouiS0616

2018/03/20 06:01

追記しておきました。 一気に理解しようとすると混乱すると思うので、頭の片隅に置いておくくらいで大丈夫です。 似たような状況に直面したときに、ご紹介した記法を積極的に使ってみてくださいな。 @mkgrei さん コメントありがとうございます。
SKMT

2018/03/21 22:02

2次元配列のreversedだと行のみ逆順になるんですね!zipは行列の転置なんですね丁寧にありがとうございます!アンパックの記事も読んでみます!
SKMT

2018/03/21 22:07

アスタリスクの使い方いっぱいあるんですね、、w 頭の片隅に入れときます!
guest

0

自己解決

gridd = [[0]*9]*6
⬇︎
gridd = [[0]*9 for i in range(6)]

と直すことでうまく行きました
上の書き方だと同じリストを並べてるだけになりどこかの行を変えると全てが変わるようになってるみたいです

投稿2018/03/19 18:37

SKMT

総合スコア57

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問