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

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

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

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

Q&A

解決済

4回答

4141閲覧

二次元配列で順序を保ったまま重複を削除したい

k0908

総合スコア102

Python

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

0グッド

0クリップ

投稿2018/05/17 02:42

arr = [[0,0], [1,1], [1,0], [1,1], [0,1], [0,0]] 

という二次元配列arrがある。

arr = [[0,0], [1,1], [1,0], [1,1], [0,1], [0,0]] arr = list(map(list, set(map(tuple, arr)))) print(arr)

とコードを書いて実行すると、

[[0, 1], [1, 0], [0, 0], [1, 1]] ```  と出力される。 二次元配列で順序を保ったまま重複を削除したいためこのコードに修正を加えたい。 理想のアウトプットは、 ```ここに言語を入力 [[0, 0], [1, 1], [1, 0], [0, 1]]

の形にすることである。

どうコードに修正を加えれば良いか?
リストは順序を保持しているはずなのに、なぜ順番が崩れるのか?
参考URL:https://qiita.com/uuuno/items/b714d84ca2edbf16ea19

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

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

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

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

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

guest

回答4

0

set(集合)は、値の集まりであって、値の間の順序を管理しません。
そのため、setを使うと順序がどうなるか判らないプログラムになってしまいます。

元のリストの順序を保って重複を削除するには、forループで順に処理していくのが良いと思います。
(大枠は以下のような感じ)

結果を入れるリストの変数を作る 重複を見つけるために空のsetを作る forループ(iがループ変数)  元のリストのi番目の要素を取り出す。 if その要素がsetに含まれていなければ その要素を結果のリストに追加する その要素をsetに追加する

投稿2018/05/17 03:03

coco_bauer

総合スコア6915

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

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

hayataka2049

2018/05/17 03:05

計算量的にはlistの線形探索がなくなる分だけこの方が有利ですね
guest

0

ベストアンサー

setに変換して重複除去するときに順番が失われています。

ライブラリを入れるとOrderedSetも使えたりするようですが、とりあえず標準機能で愚直に書いてみる例を。

python

1arr = [[0,0], [1,1], [1,0], [1,1], [0,1], [0,0]] 2 3result = [] 4for line in arr: 5 if line not in result: 6 result.append(line) 7 8print(result) 9# => [[0, 0], [1, 1], [1, 0], [0, 1]]

投稿2018/05/17 02:53

hayataka2049

総合スコア30933

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

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

k0908

2018/05/17 03:01

ありがとうございます、愚直に書くなら簡単なコードでしたね!難しく考えすぎていました
guest

0

setは集合なので、順序はない。
修正には、arr.index()をキーにソートをかける方法がある。
ただし、元コードは再代入をしているので注意が必要である。
ソート HOW TO — Python 3.6.5 ドキュメント
要素の確認(in演算子, indexメソッド, countメソッド) - リスト - Python入門

投稿2018/05/17 03:19

Lhankor_Mhy

総合スコア36115

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

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

0

python

1arr = [[0,0], [1,1], [1,0], [1,1], [0,1], [0,0]] 2arrset = list(map(list, set(map(tuple, arr)))) 3arrsetsorted = sorted(arrset,key=lambda i:arr.index(i)) 4print(arrsetsorted)

投稿2018/05/17 02:59

hiro-k

総合スコア902

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問