Pythonの二次元配列リストを、重複要素を除いてまとめるの巻

Pythonの二次元配列リストを、重複要素を除いてまとめるの巻

Pythonの二次元配列リスト(リストのリスト)で、
重複している要素リストを除いてまとめる方法のメモです。

はじめに

こういう、リストになった要素を重複して持つ二次元配列リスト同士を。。。
(リストはa、bとしています)

print(a)
[['01', '02', '03', '04'], ['11', '12', '13', '14']]
print(b)
['11', '12', '13', '14'], ['21', '22', '23', '24']]

次のように、重複を除外して足し合わせたものにしたいのワタシは。

[['01', '02', '03', '04'], ['11', '12', '13', '14'], ['21', '22', '23', '24']]

aとbを普通に足し合わせるとこんな風に残ってしまいますのでね。。。

[
['01', '02', '03', '04'],
['11', '12', '13', '14'],
['11', '12', '13', '14'],
['21', '22', '23', '24']
]

これが一次元配列のリストであれば、setにて重複要素を削除してからリストに戻せば良い、というのは検索したら良く出てくるのですが、

c = ['01', '02', '03', '04', 
     '11', '12', '13', '14', 
     '11', '12', '13', '14',
     '21', '22', '23', '24']
print(set(c))
{'01', '02', '03', '04', '11', '12', '13', '14', '21', '22', '23', '24'}
print(list(set(c))) 
['11', '03', '01', '04', '21', '22', '12', '02', '13', '14', '23', '24']
#当初の順番は無視されます

list in listの形になっている二次元配列のリストではsetが効かないんじゃ。

ですので別の方法でやらなきゃです。結局forを使えばいいのですね、という話。

二次元配列リストにはsetが効かないんじゃ

次の二次元配列リストを使ってやってみます。

a = [
    ['01', '02', '03', '04'],
    ['11', '12', '13', '14']
]

b = [
    ['11', '12', '13', '14'],
    ['21', '22', '23', '24']
]

普通に加算すると、冒頭のようにそのまま結合される。

merge = a + b
print(merge)
[
['01', '02', '03', '04'],
['11', '12', '13', '14'],
['11', '12', '13', '14'],
['21', '22', '23', '24']
]

ここからsetで重複要素を除去しようとしてもlist in listには効かない。わぁ、すみません。。。

set(merge)
-----------------------------------------------------------TypeError Traceback (most recent call last) 
<ipython-input-50-7a46158a21e1> in <module> ----> 1 set(merge) TypeError: unhashable type: 'list'

というわけで別の方法

しょうがないので次のようにやる。

a = [
    ['01', '02', '03', '04'],
    ['11', '12', '13', '14']
]

b = [
    ['11', '12', '13', '14'],
    ['21', '22', '23', '24']
]
#一旦コピーしておく
merge = a.copy()

#bの要素がaに無い場合に追加する。
for x in b:
    if x not in a:
         merge.append(x)    

print(merge)
[['01', '02', '03', '04'], ['11', '12', '13', '14'], ['21', '22', '23', '24']]

でけた。

これでもいい。

#aにない要素をbから抽出してリストを作ってaに加える。
merge = a + [x for x in b if x not in a]
print(merge)
[['01', '02', '03', '04'], ['11', '12', '13', '14'], ['21', '22', '23', '24']]

まあ、要素数が少ない時は単にremove()してもいいし、もっといい方法があるかも知らんけど。

とりあえずめでたしめでたし

Python; 3.7.2
Jupyter ; 1.0.0
macOS; Catalina version 10.15.5
で実施しました。



このブログはエックスサーバー で運営しております。


Word Press専用クラウド型レンタルサーバーwpX Speed

WordPressを使うならロリポップ!
簡単インストール完備で楽々スタート!

世界にたった一つ、あなただけのドメインを登録しよう!
格安ドメイン取得サービス─ムームードメイン─