Python備忘録 多次元配列(座標など2次元以上)のリストから重複する値を削除する方法 2023年

*間違っていたらすいません。

リストから重複する値を削除する機会に遭遇することが時々あります。

1次元配列のリストなら、list型からset型に変換することで、簡単に重複する値を1つだけに整理することが可能なようです。

#重複する値を持つ一次元配列はlist型からset型に変換することで重複を回避・整理できる

list = []

for i in range(0,6):
    for j in range(1, i):
        list.append(i)

print("Before Convert "list)

set1 = set(list)

print("Convert to set ", set1)

でも、多次元配列のリストになると、list型からset型に変換することができないため、コードを組んで整理する必要があるようです。例えば、こんなかんじでしょうか?

#重複する値(座標)を持つ二次元配列は少し手間をかけて重複を回避・整理する必要がある

#初期座標値(テスト用)を格納するlist1を初期化
list1 = []

#重複する二次元座標値を持つリストを生成
for i in range(0,6):
    for j in range(1, i):
        list1.append([i, 1])

#重複する二次元座標値を持つテスト用リストを表示
print("Before Convert ", list1)
#リストの中身は'[[2, 1], [3, 1], [3, 1], [4, 1], [4, 1], [4, 1], [5, 1], [5, 1], [5, 1], [5, 1]]'

#重複する二次元座標値を1つだけに整理したリストを格納する'list2'を初期化
list2 = []

#forループでlist1から二次元座標値を1つずつ取得
for point in list1:
    #二次元座標値をタプルに変換
    tuple_point = tuple(point)
    #タプルに変換した二次元座標値を'list2'に格納
    list2.append(tuple_point)

#タプルに変換した二次元座標値リスト'list2'をset型に変換
#この際、重複する二次元座標が削除されて整理される
set1 = set(list2)

#結果を表示
print("After Convert ", set1)
#変換後のリスト(set型)は'{(3, 1), (5, 1), (4, 1), (2, 1)}'

Output
Before Convert [[2, 1], [3, 1], [3, 1], [4, 1], [4, 1], [4, 1], [5, 1], [5, 1], [5, 1], [5, 1]] After Convert {(3, 1), (5, 1), (4, 1), (2, 1)}

これまではリスト内の値の重複を回避するために、リストに値をappendするときに以下のような構文で既存のリスト内に重複する値がないことをあらかじめif文でチェックするようにしていましたが、値の個数が大きくなると、チェックに時間がかかるかなぁと思い立ち、前述のような構文を思いつきました。
一度全ての値をリストに格納してから、前述のコードで整理するほうが理にかなっているような気がします。

for ...
if coord in coord_list:
     continue
else :
     coord_list.append(coord)

コメント

このブログの人気の投稿

【完結】ランニング、お食事 2022年5月~2022年12月

ランニング、グルメ、ドライブ 2023年4月〜

ランニング、グルメ、クライム 2023年7月〜