Pythonのリストの扱いについて基礎的なことかもしれませんがお願いします.
python
1n = 5 2array = [[0 for i in range(5)] for j in range(5)] 3for j in range(1,n-1): 4 for i in range(1,n-1): 5 array[j][i] = 1 6out: 7[[0, 0, 0, 0, 0], 8 [0, 1, 1, 1, 0], 9 [0, 1, 1, 1, 0], 10 [0, 1, 1, 1, 0], 11 [0, 0, 0, 0, 0]]
このような処理をより簡潔に行う方法はありますでしょうか?
自分の知識不足だとは思いますが内方表記やinsertを試してみても上手くいかなかったので教えていただければ幸いです.
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
可読性は無視して、とりあえず関数に閉じ込めようという発想。
numpyを使っています。
Python
1import numpy as np 2 3def make_hoge(side): 4 ret = np.zeros((side, side), dtype=int) 5 ret[1:-1, 1:-1] = 1 6 return ret 7 8for i in range(3, 6): 9 print('-'*32) 10 print(make_hoge(i)) 11 12"""出力 13-------------------------------- 14[[0 0 0] 15 [0 1 0] 16 [0 0 0]] 17-------------------------------- 18[[0 0 0 0] 19 [0 1 1 0] 20 [0 1 1 0] 21 [0 0 0 0]] 22-------------------------------- 23[[0 0 0 0 0] 24 [0 1 1 1 0] 25 [0 1 1 1 0] 26 [0 1 1 1 0] 27 [0 0 0 0 0]] 28"""
もちろん関数名は目的に応じて変更してくださいね。
投稿2018/01/23 11:04
編集2018/01/24 05:38総合スコア35660
0
ご質問のコードでアリな気もします・・・
観点がちょっと違いますが、「任意のパターンでも分かり易く」みたいな発想なら
Python
1n = 5 2 3def elm(x, y): 4 return 1 if 0 < x < n-1 and 0 < y < n-1 else 0 5 6array = [[elm(x, y) for x in range(n)] for y in range(n)]
単にPythonの比較演算子の珍しい仕様を使ってみただけという話もあります...
矩形領域の包含判定なので、それらしいクラスがそのまま利用できるようなケースもありそうです。
Python
1# こんなクラスがあるとき 2class Bounds: 3 def __init__(self, x, y, width, height): 4 self.x, self.y, self.width, self.height = x, y, width, height 5 6 def contains(x, y): 7 return self.x <= x < self.x + self.width and \ 8 self.y <= y < self.y + self.height 9 10n = 5 11bounds = Bounds(1, 1, 3, 3) 12 13array = [[1 if bounds.contains(x, y) else 0 for x in range(n)] for y in range(n)]
要するに本件のarrayの生成のみならずあちこちで領域の包含判定があるならBoundsのようなクラスあるいは関数が用意されてしかるべきなので、arrayの生成時にもそれを利用すればよいという考えです。
投稿2018/01/23 11:20
編集2018/01/23 11:22総合スコア18394
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
可読性が悪化するかもしれませんが、全て内包表記で済ませたい、という意味でしたらこうでしょうか?
python
1N = 5 2array = [[1 if 0<i<N-1 else 0 for i in range(N)] if 0<j<N-1 else [0]*N for j in range(N)] 3 4for l in array: 5 print(*l)
出力
plain
10 0 0 0 0 20 1 1 1 0 30 1 1 1 0 40 1 1 1 0 50 0 0 0 0
投稿2018/01/23 10:58
総合スコア2043
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/24 02:47
2018/01/24 02:55
0
文字列で生成してリスト化する。
python
1cols = 8 2rows = 5 3array = [list(map(int, '0'+'1'*(cols-2)+'0' if 0 < row < rows-1 else '0'*cols)) for row in range(0, rows)] 4for row in array: 5 print(row) 6 7# [0, 0, 0, 0, 0, 0, 0, 0] 8# [0, 1, 1, 1, 1, 1, 1, 0] 9# [0, 1, 1, 1, 1, 1, 1, 0] 10# [0, 1, 1, 1, 1, 1, 1, 0] 11# [0, 0, 0, 0, 0, 0, 0, 0]
最初に考えたのはこっちw
python
1array = [[int(1 <= col < cols-1 and 1 <= row < rows-1) for col in range(0, cols)] for row in range(0, rows)]
投稿2018/01/24 06:56
総合スコア16731
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/23 23:23
2018/01/24 05:39