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()してもいいし、もっといい方法があるかも知らんけど。
とりあえずめでたしめでたし
ちょっと広告です
https://business.xserver.ne.jp/
https://www.xdomain.ne.jp/
★LOLIPOP★
.tokyo
MuuMuu Domain!
Python; 3.7.2
Jupyter ; 1.0.0
macOS; Catalina version 10.15.5
で実施しました。
このブログはエックスサーバー で運営しております。
WordPressを使うならロリポップ!
簡単インストール完備で楽々スタート!
世界にたった一つ、あなただけのドメインを登録しよう!
格安ドメイン取得サービス─ムームードメイン─