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

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

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

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

Q&A

解決済

3回答

342閲覧

2つのリストの中に一致する要素がある時、その値を"NaN"置換したい

Yumame

総合スコア6

Python

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

0グッド

0クリップ

投稿2020/06/02 14:24

aのリストの中にある要素がbのリストにもあった場合、bのリストのその要素を"NaN"に書き換えたcというリストを作りたいです。
やりたいこと
a = [1, 3, 5, 8, 2, 9]
b = [2, 4, 6, 3, 7, 10]
を比較して以下のcリストを作る
c = [NaN, 4, 6, NaN, 7, 10]

for文を使って書いてみましたが、期待とは全く違う動きをしてしまいます。
何かいい方法があれば教えてください。どうぞ宜しくお願いします。

python

1a = [1, 3, 5, 8, 2, 9] 2b =[2, 4, 6, 3, 7, 10] 3 4 5str_a = [str(x) for x in a] 6str_b = [str(y) for y in b] 7 8c = [] 9for x in str_a: 10 for y in str_b: 11 if x == y: 12 rep = y.replace(y, "NaN") 13 c.append(rep) 14 else: 15 c.append(y) 16 17print(c) 18

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

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

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

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

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

guest

回答3

0

ベストアンサー

python

1a = [1, 3, 5, 8, 2, 9] 2b = [2, 4, 6, 3, 7, 10] 3c = [_ if _ not in a else "NaN" for _ in b] 4print(c) 5# ['NaN', 4, 6, 'NaN', 7, 10]

NaNは文字列の"NaN"でいいですかね。np.nanでは?

投稿2020/06/02 15:01

x98000

総合スコア1096

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

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

Yumame

2020/06/02 16:00

出来ました!!!!!ありがとうございます!しかも本当にやりたかったのはnp.nanでした。察して頂いて感謝です。
guest

0

Python

1nan = float('nan') 2 3set_a = set(a) 4c = [ 5 nan if e in set_a else e 6 for e in b 7] 8print(c)

お二方の良いとこどりみたいな回答ですけれど、

  • nanは組み込みで用意されている
  • setはsetのまま使って初めて帰属演算に有利になる

ということは主張しておきたいと思います。

投稿2020/06/03 00:18

LouiS0616

総合スコア35660

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

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

Yumame

2020/06/03 00:34

ありがとうございます!仕組みがよく分かっていないことが多いので大変勉強になります。
guest

0

fot 文を使った例では、以下で実現可能かと思います。

python

1import numpy as np 2import copy 3a = [1, 3, 5, 8, 2, 9,11,2,6] 4b = [2, 4, 6, 3, 7, 10] 5c = copy.copy(b) 6for i in range(len(c)): 7 for j in range(len(a)): 8 if c[i] == a[j]: 9 c[i] = np.nan 10print(c)

for 文を使わない場合は下記の方法でも実現可能かと思います。

python

1import numpy as np 2a = [1, 3, 5, 8, 2, 9] 3b = [2, 4, 6, 3, 7, 10] 4l_dup = list(set(a)&set(b)) #重複要素のリスト作成 5def dup(i): 6 if i in l_dup: 7 i = np.nan 8 return i 9c = list(map(lambda i: dup(i), b)) 10print(c)

文字列の"NaN" は np.nan にして記載おります。
ご参考まで。

投稿2020/06/02 15:50

sgry7112

総合スコア15

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

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

Yumame

2020/06/02 16:33

回答ありがとうございました!for文の方はrange(len())を使ってindexでlistの要素を指定できるようにすれば良かったんですね。目から鱗です。自力では絶対思いつきませんでした。大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問