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

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

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

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

Q&A

解決済

2回答

3675閲覧

Python  リスト内に特定の文字列を含んでいる要素があった場合、その要素を削除

goki_gottan

総合スコア168

Python

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

0グッド

0クリップ

投稿2019/03/31 10:41

list1 = ['physics', 'chemistry', 1997, 2000]
というリストが会った時、
特定の文字列である a = "phy" を含んでいる要素を削除したいと思っております。
結果として、list1 = ['chemistry', 1997, 2000] としたいという事です。

特定の文字が要素すべてと一致した場合は、in関数で削除できることは知ったのですが、
含まれる文字列となりますとin関数ではムリです。

また、含まれている文字列の要素を検索し、さらに消すとなりますと、さらにややこしいです。

この場合、for文で、1個1個見て、特定の要素が含まれているか調査し、
その要素場所を削除するという方法になるかと思いますが、
他に簡単な構文で書ける方法はありますでしょうか。

何卒、お知恵を拝借させてください。
宜しくお願いいたします。

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

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

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

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

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

guest

回答2

0

filterを使います。filterは、条件を満たす要素だけをリストに含める機能です。

  • type が str のとき、'phy'を含まない
  • type が str 以外、無条件に True

python3

1list1 = ['physics', 'chemistry', 1997, 2000] 2list(filter(lambda x: x.find('phy') == -1 if type(x) is str else True , list1))

投稿2019/03/31 11:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

goki_gottan

2019/03/31 11:16

リスト内表記でもできるのですね、ありがとうございます。すみません、最初の方のご回答が早かったので、ベストアンサーに選んでしまいましたが、ご対応くださいましてありがとうございます。
LouiS0616

2019/03/31 12:06 編集

@amdahlslaw さん ラムダ式は lambda x: 'phy' not in x if isinstance(x, str) else True の方がより直接的で簡潔では。 特に部分文字列の帰属判定を str.find() == -1 で行うのはバッドノウハウです。 https://docs.python.org/ja/3/library/stdtypes.html#str.find 短絡評価を利用して lambda x: not isinstance(x, str) or 'phy' not in x とするのもアリだと思います。 ド・モルガン則で変形して lambda x: not (isinstance(x, str) and 'phy' in x) でも良いですね。
goki_gottan

2019/03/31 12:04

色々と詳しいことをご存知で、頭が下がります。 現在、回帰文を作成しており、for文でつくったリストをさらに、for文で回帰するのですが、 何回繰り返すか未知で、考えこんでおります。 申し訳ございません、今回の案件とは違うのですが、Louiさんでしたらご存知かもしれませんね。 ありがとうございました。
goki_gottan

2019/03/31 16:12

すみません、ちなみに含まれないものは除去の場合は、どうなるのでしょうか。
goki_gottan

2019/03/31 16:16

さらに全て文字列限定とさせていただきます。list1は数値が入っておりましたが、それも文字列だった場合でお願いします。 list1 = ['physics', 'chemistry','indust' ,'drug'] でお願いします。
退会済みユーザー

退会済みユーザー

2019/03/31 18:24

LouiS0616さんありがとうございます。「所属検査演算」in/not inについて理解しました。isinstanceは、サブクラスにも判断が及ぶことがわかりました。短絡評価はよいコードですね。 文字列限定だとしても、filterか内包表記かについては、どうでしょうか?
guest

0

ベストアンサー

for文で、1個1個見て、特定の要素が含まれているか調査し、

その要素場所を削除するという方法になるかと思いますが、
他に簡単な構文で書ける方法はありますでしょうか。

消したい要素をリストから取り除くより、
残したい要素だけを用いて新たなリストを作った方が楽で不具合も生じにくいです。

元のリストの要素が全て文字列であった場合(註)のサンプルコードです。

Python

1# ここでは ↓ これらの要素 ↓ も文字列とする 2src = ['physics', 'chemistry', '1997', '2000'] 3 4dst = [] 5for elem in src: 6 if 'phy' not in elem: # 'phy' が含まれないものだけ 7 dst.append(elem) 8 9print(dst)

あるいはリスト内包表記を用います。

Python

1src =2 3dst = [ 4 elem for elem in src if 'phy' not in elem 5] 6print(dst)

はたまた以下のように高階関数を用います。

Python

1src =2 3dst = list( 4 filter( # itertools.filterfalse の方が否定論理で書ける分直感的かも 5 lambda e: 'phy' not in e, src 6 ) 7) 8print(dst)

個人的には内包表記をお勧めしますが、
for文の方が分かり良いならば無理に活用する必要は無いでしょう。少しずつ慣れていけば良いです。


註: 質問で提示されている例に反する前提を敢えて置いたのには二つ理由があります。
0. リストの要素の型は揃っている方が一般に扱いやすいため。
揃わないのであれば同じリストに詰めず、クラスやタプルを活用した方が良いです。
0. 丸投げ回答を避けるため。

投稿2019/03/31 11:01

編集2019/03/31 11:09
LouiS0616

総合スコア35660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問