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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2059閲覧

python|二次元配列内の子要素の重複を削除する

CookieM

総合スコア7

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2023/01/14 07:58

実現したいこと

二次元配列の重複削除をしたい。
ただし、制約事項として下記がある。
・二次元配列内の子要素となるリストには数値と文字列が含まれている
・子要素同士を比較した際、並び順が違うだけで構成要素が同じ場合は重複したものとみなす
・重複削除後の子要素内の並び順はオリジナルのものと同じとする

該当のソースコード

python

1#重複削除前のリスト 2original_list = [['A',2,3],[2,'A',3],[1,'B',4],[3,4,1],[1,4,'B']] 3 4#重複削除後の成果物→['A',2,3],[2,'A',3]および[1,'B',4],[1,4,'B']は重複しているものとみなす 5output_list = [['A',2,3],[1,'B',4],[3,4,1]]

試したこと

一番近いところまでいったのはset関数を使ったものだが
制約事項の子要素の並び順がずれてしまうことから断念。

python

1original_list = [['A',2,3],[2,'A',3],[1,'B',4],[3,4,1],[1,4,'B']] 2set_list = list(set(i) for i in original_list) 3output_list = [] 4for i in set_list: 5 if i not in output_list: 6 output_list.append(i) 7output_list 8#[{2, 3, 'A'}, {1, 4, 'B'}, {1, 3, 4}]

補足情報(FW/ツールのバージョンなど)

python3.7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答3

0

more-itertools の unique_everseen を使う場合。

python

1from more_itertools import unique_everseen 2 3original_list = [['A',2,3],[2,'A',3],[1,'B',4],[3,4,1],[1,4,'B']] 4 5result = [*unique_everseen(original_list, key=frozenset)] 6print(result) 7 8# [['A', 2, 3], [1, 'B', 4], [3, 4, 1]]

投稿2023/01/14 08:45

編集2023/01/14 08:47
melian

総合スコア21109

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

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

0

ベストアンサー

original_listの要素のリストの各要素をstrに統一(かつソートしてtuple化)したものを重複チェック対象とすればよいかと思います。
ただし念のため各要素において型は異なるが同じstrになるもの(123"123"など)を別物と判断するためにその型も含めるようにします。

Python

1original_list = [['A',2,3],[2,'A',3],[1,'B',4],[3,4,1],[1,4,'B']] 2dup = dict() 3output_list = [] 4for e in original_list: 5 t = tuple(sorted(map(lambda e:(str(e),type(e)),e))) 6 if t not in dup: 7 output_list.append(e) 8 dup[t] = e 9print(output_list) # [['A', 2, 3], [1, 'B', 4], [3, 4, 1]]

投稿2023/01/14 08:23

編集2023/01/14 08:25
can110

総合スコア38352

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

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

bsdfan

2023/01/14 11:39

output_list を作らずに list(dup.values()) でも良いように思いました。
can110

2023/01/14 12:22

あ。ですね。
guest

0

重複削除前のリストの子リストをsetにしたリストを作っておき、このリストを重複チェックに使う例です。

Python

1# 重複削除前のリスト 2original_list = [['A',2,3],[2,'A',3],[1,'B',4],[3,4,1],[1,4,'B']] 3 4# 子リストをsetにしたリストを作成 5sets_list = [*map(set, original_list)] 6 7# 重複削除後のリスト 8output_list = [ 9 x for i, x in enumerate(original_list) 10 if i == next(filter(lambda y: y[1] == sets_list[i], enumerate(sets_list)), (-1, ))[0] 11] 12 13print(output_list) # => [['A', 2, 3], [1, 'B', 4], [3, 4, 1]] 14

投稿2023/01/14 09:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問