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

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

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

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

Q&A

解決済

3回答

300閲覧

Pythonのリスト処理について

yusu222

総合スコア12

Python

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

0グッド

0クリップ

投稿2019/06/20 07:02

Pythonのリストについて質問です。
重複した数字、文字列を含むリストから順序を変えずに重複している文字列だけを削除する方法が分かりません。
ご教授よろしくお願いいたします。

やりたいこと

処理前  list = [1, 6, 1, 10, "apple", "orange", "apple", "grape"]

  ↓重複文字列を除去

処理後  list = [1, 6, 1, 10, "apple", "orange", "grape"]

Python

1list = [1, 6, 1, 10, "apple", "orange", "apple", "grape"] 2list_pro = [] 3for i in list: 4 if i not in list_pro: 5 list_pro.append(i) 6

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

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

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

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

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

guest

回答3

0

ベストアンサー

記憶用の集合を用意するのが簡単です。

Python

1src = [1, 6, 1, 10, "apple", "orange", "apple", "grape"] 2_work_set = set() 3 4dst = [] 5for e in src: 6 if not isinstance(e, str): 7 dst.append(e) 8 continue 9 10 if e in _work_set: 11 continue 12 13 _work_set.add(e) 14 dst.append(e) 15 16print(dst)

実行結果 Wandbox

[1, 6, 1, 10, 'apple', 'orange', 'grape']

また、そもそも数値と文字列を同じリストに入れているのが間違いだとも思います。
後々の処理が簡潔になるように、同じ型の要素のみで構成した方が良いです。

その他、気になること

変数名として list を用いることは厳に避けて下さい。
解消しづらいエラーを引き起こします。

Python

1>>> list('spam') 2['s', 'p', 'a', 'm'] 3>>> 4>>> list = [1, 2, 3] 5>>> 6>>> list('spam') 7Traceback (most recent call last): 8 File "<stdin>", line 1, in <module> 9TypeError: 'list' object is not callable

シャドウイングと呼ばれるトラブルです。
他にも付けてしまいがちな名前として、str id len int input dict などがあります。

投稿2019/06/20 07:08

編集2019/06/20 07:14
LouiS0616

総合スコア35660

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

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

yusu222

2019/06/20 08:00

ご丁寧な回答ありがとうございます。 記憶用の集合、簡単に書けて便利ですね! 無事に解決できました。 リストの構成や変数名のつけ方など、とても勉強になりました。 ありがとうございました。
guest

0

集合を使わなくてもリストだけで出来ますね。

Python

1a = [1, 6, 1, 10, "apple", "orange", "apple", "grape"] 2b = [] 3t = [] 4for e in a: 5 if type(e) != str: 6 b.append(e) 7 elif not e in t: 8 t.append(e) 9 b.append(e) 10print(b)

投稿2019/06/21 13:35

kazuma-s

総合スコア8224

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

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

LouiS0616

2019/06/21 13:55

katoyさんへのコメントでも書きましたが、この方法はO(n²)です。 集合を用いるのに充分な理由があります。
guest

0

x.py

python3

1def is_first(data, idx): 2 if type(data[idx]) != str: 3 return True 4 return data.index(data[idx]) == idx 5 6data = [1, 6, 1, 10, "apple", "orange", "apple", "grape"] 7data2 = [data[i] for i in range(len(data)) if is_first(data, i)] 8print(data2)

実行例
イメージ説明

is_first() の定義を調整することで、他の条件で要素の順番を保って取り出すことができます。

追記:
計算量はへっていないかもしれませんが、行数をさらに少なくしてみました。

y.py

python3

1data = [1, 6, 1, 10, "apple", "orange", "apple", "grape"] 2 3z = {e: idx for idx, e in reversed(list(enumerate(data))) if type(e) == str} 4data2 = [e for idx, e in enumerate(data) if z.get(e) == None or z.get(e) == idx] 5print(data2)

イメージ説明

data を後ろかスキャンしながら 要素 -> 出現位置 のハッシュをつくっていっています。
(値は、最初にその要素が出現した位置になります)
こうして作ったハッシュをつかって data から重複値を取り除いていきます。

投稿2019/06/20 23:01

編集2019/06/21 12:55
katoy

総合スコア22324

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

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

LouiS0616

2019/06/21 00:07

確かにその方法でも可能なのですが、O(n²) なのが悩みどころです。 また is_first の責務が広過ぎるようにも思います。担っている役割に沿って命名し直すなら、 is_not_str_or_is_first になってしまうでしょう。
LouiS0616

2019/06/21 14:06

> 計算量はへっていないかもしれません これは線型ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問