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

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

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

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

Q&A

解決済

5回答

168閲覧

2次元リストの要素指定について

R_SSK

総合スコア15

Python 3.x

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

0グッド

0クリップ

投稿2018/01/23 10:45

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ページで確認できます。

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

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

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

guest

回答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
LouiS0616

総合スコア35660

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

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

magichan

2018/01/23 23:23

今回の場合は、単に ret[1:-1, 1:-1] = 1 でも問題ない気がします。
LouiS0616

2018/01/24 05:39

ですね。詰めが甘かったです。 ご指摘ありがとうございます。回答に反映させていただきました。
guest

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
KSwordOfHaste

総合スコア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

namnium1125

総合スコア2043

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

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

R_SSK

2018/01/24 01:44

回答ありがとうございました!numpyしか使ってこなかったので内方表記の書き方がよくわかっていませんでした.また分からないことがあったらお願いします!
namnium1125

2018/01/24 02:47

numpyを使用しておられるならばLouiS0616様の方法の方がnumpyらしいような気がしますけどね。無事解決したならば何よりです。
R_SSK

2018/01/24 02:55

numpyでやっていることをリストでやるとどうなるのか疑問に思っての質問でした.質問内容があいまいでした,何がしたいのかをしっかり書くようにします????
guest

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

fuzzball

総合スコア16731

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

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

0

質問者の内容でしたら下記が一番見やすいかと思ったので一応回答させていただきます。

import numpy as np a = np.array([[0] * 5] * 5) a[1:-1, 1:-1] = 1 print(a) """出力 [[0 0 0 0 0] [0 1 1 1 0] [0 1 1 1 0] [0 1 1 1 0] [0 0 0 0 0]] """

投稿2019/10/24 02:10

omixin

総合スコア58

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問