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

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

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

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

Q&A

解決済

5回答

2529閲覧

Pythonで2つのリストの要素を比較したい

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2021/05/27 05:05

実現したいことと課題

お世話になります。
Pythonで2つリストの要素を比較したいと考えています。

比較の内容は、
あるリスト(以下、ss)の要素(文字列)に、除外したい文字列(リスト形式で保持、以下、jyogai)が含まていないものを残したいと考えています。

Python

1#あるリストと除外したい要素のリストの比較 2#SS:使用するリスト 3#jyogai:除外対象の文字列が入ったリスト 4#nokositaimono:ssの要素の内、jyogaiの要素を含んだものを除外したリスト 5 6#配列の要素比較 7for ss_item in ss: 8 for jyogai in jyogai_list: 9 if jyogai not in ss_item: 10 nokositaimono.append(ss_item)

上記のコードで実行すると以下のエラーが表示されます。
解決方法についてアドバイスをいただきたく、よろしくお願いします。

エラーメッセージ


Error

sys:1: DtypeWarning: Columns (4,6,7) have mixed types.Specify dtype option on import or set low_memory=False.

Traceback (most recent call last):

File "<string>", line 1, in <module>

File "c:\users\desktop\work\python\実行プログラム.py", line 35, in SearchURL

if jyogai not in ss_item:

TypeError: 'in <string>' requires string as left operand, not NoneType

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

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

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

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

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

udon-ken

2021/05/27 05:17

SS:使用するリスト の要素に重複する要素はありますか? 例:[1,2,1,4,3,1] みたいに。
udon-ken

2021/05/27 05:21

あ! この件は現在のコードとは関係ないです。 「set型使ったら楽かなー」って考えていたら、投稿してしまったので気にしないで下さい。
guest

回答5

0

python3

1# elem が jyogais の要素をどれも含んでいないなら True 2def check(elem, jyogais): 3 return any(map(lambda j: j in elem, jyogais)) 4 5def task(data, jyogais): 6 js = [x for x in jyogais if x is not None] # jyogais から None を取り除く 7 return list(filter(lambda x: x is None or not check(str(x), js), data)) 8 9ss =[ 10 None, 1, 11 'http://www.google.com/xxx&#039', 'https://www.microsoft.com/yyyy&#039', 12 'http://xxx.yyy.zzz&#039' 13] 14jyogai_list = ['.google.com', '.microsoft.com', None] 15print(task(ss, jyogai_list))

実行例:
イメージ説明

投稿2021/05/28 23:51

katoy

総合スコア22324

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

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

退会済みユーザー

退会済みユーザー

2021/05/31 02:45

ご回答いただき、誠にありがとうございます。 処理が分けられていてすごく理解しやすかったです。 いただいた内容を踏まえ、コードを修正して見ます。
guest

0

ppaul さんと本質は同じですが、個人的には all の方が読みやすいです。
文字列以外の要素が None のみの前提です。

Python

1ss =['apple', 'orange', 'berry'] 2jyogai_list = ['app', None, 'rr'] 3lst = [s for s in ss if all((not jyogai) or jyogai not in s for jyogai in jyogai_list)] 4print(lst) # ['orange']

投稿2021/05/27 09:29

lehshell

総合スコア1156

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

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

退会済みユーザー

退会済みユーザー

2021/05/27 14:12

アドバイスをいただき、ありがとうございます。 私のやりたいこと自体は、ご教示いただいたコードで実現可能であると思うのですが、 自分の環境だと、どうしても同じようになりませんでした。 もう一度、コード自体見なおしてみます。
guest

0

ベストアンサー

エラーの原因は、can110さんの書かれている通りです。

教えてしまうと勉強にはならないかもしれせんが、初心者の方には難しいような気がしますので回答します。
ループで書くと、フラグを使うとかして、あまり綺麗なプログラムにできないように思います。
内包表記を使うとまあまあのコードになるのですが、あまり気に入ってはいません。

どなたかもっとわかりやすいコードがあれば私も知りたいので教えてください。

python

1>>> ss =['apple', 'orange', 'berry'] 2>>> jyogai_list = ['app', None, 'rr'] 3>>> 4>>> print([s for s in ss if not any([type(jyogai)==str and jyogai in s for jyogai in jyogai_list])]) 5['orange']

コメントされた入力例は文法エラーなので、適当に修正してみました。

python

1>>> ss =['http://www.google.com/xxx&#039', 'https://www.microsoft.com/yyyy&#039', 'http://xxx.yyy.zzz&#039'] 2>>> jyogai_list = ['.google.com', '.microsoft.com'] 3>>> ss 4['http://www.google.com/xxx&#039', 'https://www.microsoft.com/yyyy&#039', 'http://xxx.yyy.zzz&#039'] 5>>> jyogai_list 6['.google.com', '.microsoft.com'] 7>>> print([s for s in ss if not any([type(jyogai)==str and jyogai in s for jyogai in jyogai_list])]) 8['http://xxx.yyy.zzz&#039']

どういう出力を期待しているのでしょうか?

投稿2021/05/27 06:12

編集2021/05/27 11:51
ppaul

総合スコア24670

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

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

退会済みユーザー

退会済みユーザー

2021/05/27 09:05

アドバイスをいただき、ありがとうございます。 また、ご配慮をいただきありがとうございます。 今時点、うまく動作していなくいろいろと試行錯誤しています。 実際のリストデータは以下のようなイメージなのですが、文字の部分比較がうまくいっていないように感じています。 ss =['http://www.google.com/xxx', 'https://www.microsoft.com/yyyy', 'http://xxx.yyy.zzz'] jyogai_list = ['.google.com', .microsoft.com] inで比較した際に、「http://www.google.com/xxx」が除外されず、リストに残っている状況です。 なお、コードは試行錯誤している最中なので、今は以下のようにしています。 ss = filter(None,ss) jyogai_list = filter(None,jyogai_list) uniq_url_list = [] request_word = '' for ss_item in ss: for jyogai in jyogai_list: if jyogai in ss_item: request_word = '' break request_word = ss_item if request_word != '': uniq_url_list.append(request_word)
退会済みユーザー

退会済みユーザー

2021/05/27 14:10

再度アドバイスをいただき、ありがとうございます。 やりたいことは、修正いただいたコードの実行結果の通りなんですが、どうも自分の環境だとその通りにならないです。 実現可能であることはご提示いただいたので、もう一度自分の環境を見直してみます。
guest

0

jyogai_listNoneである要素が含まれていると提示エラーが発生します。確認ください。

Python

1ss = ['abc'] 2jyogai_list = ['ab', None] 3nokositaimono = [] 4for ss_item in ss: 5 for jyogai in jyogai_list: 6 if jyogai not in ss_item: # TypeError: 'in <string>' requires string as left operand, not NoneType 7 nokositaimono.append(ss_item)

なお、提示コードでは意図した動作をしませんので処理を見直してください。
たとえばss_item = 'abc'jogai_list = ['d','e']の場合、nokositaimonoにはabcが2つ入ります。

投稿2021/05/27 05:27

編集2021/05/27 05:35
can110

総合スコア38341

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

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

退会済みユーザー

退会済みユーザー

2021/05/27 08:59

アドバイスをいただき、ありがとうございます。 ご指摘いただいた内容が理解できました。 今まだ、期待通りの動作になっていませんが、以下のように変更しています。 ss = filter(None,ss) jyogai_list = filter(None,jyogai_list) uniq_url_list = [] request_word = '' for ss_item in ss: for jyogai in jyogai_list: if jyogai in ss_item: request_word = '' break request_word = ss_item if request_word != '': uniq_url_list.append(request_word)
guest

0

このエラー、
if jyogai not in ss_item:
の右辺左辺が文字列だからですかね?

ss_itemがjyogai_listに含まれているかどうかを確認するだけなら、

python

1for ss_item in ss: 2 if ss_item not in jyogai_list: 3 nokositaimono.append(ss_item)

でいいように思います。
(補足で失敗コメント付けて慌てて書いた為、間違ってるかも・・)

追記

python

1ss = ['apple', 'orange', 'berry'] 2jyogai_list = ['apple', 'berry'] 3nokositaimono = [] 4 5# ループを使う方法 6for ss_item in ss: 7 if ss_item not in jyogai_list: 8 nokositaimono.append(ss_item) 9 10print(nokositaimono) 11 12# set型を使う方法(ssに重複要素が無い場合) 13ss_set = set(ss) 14jyogai_set = set(jyogai_list) 15nokositaimono = list(ss_set - jyogai_set) 16 17print(nokositaimono)

投稿2021/05/27 05:30

編集2021/05/27 06:38
udon-ken

総合スコア657

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

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

退会済みユーザー

退会済みユーザー

2021/05/27 05:48

アドバイスをいただき、ありがとうございます。 やりたいことが複雑で、私の質問自体、自分で読んでもわかりずらいので大変恐縮です。。。 やりたいことは、 ss:[apple,orange,berry] jyogai:[app,rr] だった時に、 nokositaimono:[orange] と残したいです。 最初は nokositaimono = list(set(ss) - set(jyogai_list))でやったのですが、これだと要素が完全一致しないと除外できず、やり方を模索しています。
udon-ken

2021/05/27 06:22

リストの定義がなんか変ですが・・・ 実際は正しく定義されているとして、回答に追記しました。 が・・・・・ もしかして、 ss = ['apple','orange','berry'] が正しいのではなくて、 apple = 'apple' orange = 'orange' berry = None ss = [apple,orange,berry] というようなコード書いてたりします??
退会済みユーザー

退会済みユーザー

2021/05/27 06:34

コメントをありがとうございます。 実際はExcelの列を読み込んでリストにしています。 (pandasでデータ取得して、tolist()でリストに変換しています。) apple = 'apple' orange = 'orange' berry = None ss = [apple,orange,berry] このような書き方もできるのですね、知りませんでした。
udon-ken

2021/05/27 06:45

ああ・・・元がExcelですか・・・ であれば、やはり他の回答者様の推測通り、Noneが混入しているのですね。 Noneが混入しているのでしたら、私が提示したコードは使えません。 あれを修正するとしたら、他の回答者様のおっしゃるとおり > ループで書くと、フラグを使うとかして、あまり綺麗なプログラムにできないように思います。 です。 どちらかというと、全部文字列であった方が使い勝手がいいと思いますのでリストにする段階でNoneは''(空文字列)に置き換えた方がいいようには思いますね。
退会済みユーザー

退会済みユーザー

2021/05/27 08:59

色々とアドバイスをいただき、ありがとうございます。 まだうまくいっていないのですが、もう少し考えてみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問