リスト内リストのうち共通要素をもつものを別リストにまとめる方法
リスト内リストのうち共通要素をもつものを別リストにまとめる方法
使用言語 Python 使用期間1か月ほど
知りたいこと
:リスト内リストのうち重複しているものを別リストにまとめる方法
始めた手でよくわかっていませんので、
私の立てた方針よりも効率が良い解法があればご教示をお願いしたいです
Pythonを始めてまだ1か月くらいでわからないことだらけです…
発生している問題・エラー
まず以下の問題が与えられて
「n*nの二次元配列にランダムに0か1が格納されているとき、
ある位置の要素についてその四近辺に同じ要素があれば同一領域とみなす
1の領域のうち最も大きい領域の面積を出力するプログラムをつくる」
例 五次元配列で
[[0 1 0 1 0]
[0 0 0 0 1]
[1 1 1 0 0]
[1 1 1 1 0]
[0 0 1 1 1]]
この場合最大領域面積は左下のあたりの10となる
その解決の方針として以下のように考えました
"""
①1の領域をみつける
②その領域が接しているマスの上下左右でで1を持つものの座標をまとめて一つのリストに格納
③全領域におこなう
④あるリストと、他のリストが共通項をもっていたらそれらを被りがないように統合
⑤かぶりがなくなるまで続ける
⑥リストのうち最も要素数がおおいものが答え
"""
③までは何とかかけたのですが(下記コード)、
④の共通項をもっていることの判別とそれらの統合がどうしてもできず
皆様のお力をお借りしたいです
例えば以下の五次元配列で
[[0 1 0 1 0]
[0 0 0 0 1]
[1 1 1 0 0]
[1 1 1 1 0]
[0 0 1 1 1]]
②の段階でこのようになったものを
[[(3, 0), (2, 1), (2, 0)], [(3, 1), (2, 2), (2, 0), (2, 1)], [(3, 2), (2, 1), (2, 2)], [(2, 0), (3, 1), (3, 0)], [(2, 1), (3, 2), (3, 0), (3, 1)], [(2, 2), (4, 2), (3, 3), (3, 1), (3, 2)], [(4, 3), (3, 2), (3, 3)], [(3, 2), (4, 3), (4, 2)], [(3, 3), (4, 4), (4, 2), (4, 3)], [(4, 3), (4, 4)]]
例えば初めの3つ
[(3, 0), (2, 1), (2, 0)]
[(3, 1), (2, 2), (2, 0), (2, 1)]
[(3, 2), (2, 1), (2, 2)]
は(2, 1)の共通項を持っている=隣接している と考えられるので
それぞれ重複のないように取り出して
[(3, 0),(3, 1), (2, 2), (2, 0), (2, 1),(3, 2)]
一つにリストにまとめたいとおもっています
改めて質問したいことは
一つのリストにまとめる方法
もしご都合がよろしければ
そもそもこのプログラム方針自体非効率極まりないと思っているので
まずどういう方針でプログラムを作る方が効率的だったか
教えていただきたいです
こちらも初投稿で
わからないことだらけではありますが
何卒宜しくお願い致します。
### 該当するソースコード
```Python
# n次元配列をつくる
class Board:
def __init__(self):
self.RawBoard = np.random.randint(0, 2, (raw,raw),dtype=int)
self.number = 0
self.list = []
self.baselist = []
self.subbaselist = []
self.compactlist = []
# raw = 作りたい配列の次元数をinputで入力
#1を探す
def find(self):
for x in range(0, raw):
for y in range(0,raw):
if self.RawBoard[x,y] == 1:
self.list.append(x)
self.list.append(y)
self.number +=1
print(self.number)
#1のx,y座標をひとつづつリスト(subbaselist)に格納し、まとまったらbaselistに再格納
def check(self):
for i in range(self.number):
x = int(self.list[2*i]) #x座標
y = int(self.list[2*i+1]) #y座標
# 0=<x=<raw-1 0=<y=<raw-1
# 上
if (x>0) and (self.RawBoard[x-1,y] == 1):
# もし上の座標にある値が1 かつ y座標が0より大きいなら
self.subbaselist.append((x-1,y))
# 下
if (x<raw-1) and (self.RawBoard[x+1,y] == 1):
self.subbaselist.append((x+1,y))
# 右
if (y<raw-1) and (self.RawBoard[x,y+1] == 1):
# もし上の座標にある値が1 かつ y座標self.list[i+1]-1が0より大きいなら
self.subbaselist.append((x,y+1))
# 左
if (y>0) and (self.RawBoard[x,y-1]) == 1:
# もし上の座標にある値が1 かつ y座標self.list[i+1]-1が0より大きいなら
self.subbaselist.append((x,y-1))
# subbaselistの戸数が0個以上なら元座標を足して、ベースリストを作成
if len(self.subbaselist) > 0:
self.subbaselist.append((x, y))
self.baselist.append(self.subbaselist)
self.subbaselist = []
ここから作成途中でわからなくなった部分
# def compact(self):
# self.compactlist =
#
#
# def make(self):
# a = 1
# b = 1
# for x in self.baselist[a] :
# if x not in self.baselist[range(self.number)]:
# self.baselist[a].append(self.baselist[b])
#実行用メインコード
print("何次元配列にしますか?")
raw = int(input())
test = Board()
print(test.RawBoard)
test.find()
print(test.list)
test.check()
print(test.baselist)
### 自分で試したこと
ここに問題・エラーに対して試したことを記載してください。
# def make(self):
# a = 1
# b = 1
# for x in self.baselist[a] :
# if x not in self.baselist[range(self.number)]:
# self.baselist[a].append(self.baselist[b])
ここでリスト内包表記?も試したのですが、よくわからず変な変数が入り混じっています…