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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

2回答

1048閲覧

Python3 配列検索

AMK

総合スコア765

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/12/05 06:45

###完成イメージ
Python3の勉強の為、CSVから配列にインポートして
その配列内を検索してインポートしたデータ(配列)に無い数字をリストアップするプログラムを
組もうと思い試行錯誤していますが、自力解決は困難と判断したので質問させて頂きます。

知りたいこと

私の作成したプログラムだと判定が全部Falseになってしまう原因は何でしょうか??

###CSVの中身は下記の通りです
[['1'], ['5'], ['15'], ['16'], ['18'], ['27'], ['28'], ['29'], ['58'], ['61'], ['62'], ['62'], ['63'], ['64'], ['65'], ['66'], ['71'], ['72'], ['74'], ['75'], ['76'], ['77'], ['78'], ['79'], ['80'], ['81'], ['82'], ['84'], ['85'], ['86'], ['87'], ['88'], ['89'], ['90'], ['91'], ['92'], ['93'], ['94'], ['95'], ['96'], ['97'], ['98'], ['99'], ['100'], ['101'], ['1203651161'], ['1200105667'], ['102'], ['103'], ['104'], ['105'], ['106'], ['107'], ['108'], ['109'], ['110'], ['111'], ['112'], ['113'], ['113'], ['114'], ['115'], ['116'], ['117'], ['118'], ['119'], ['120'], ['121'], ['122'], ['123'], ['124'], ['125'], ['126'], ['127'], ['128'], ['129'], ['130']]

python

1import csv 2 3#配列初期化 4new_data=[] 5data=[] 6#CSVからデータ取り出し 7f = open("data.csv","r",encoding="SHIFT-JIS") 8reader = csv.reader(f) 9#取り出したデータをリスト化 10data = [ e for e in reader ] 11#for row in reader: 12# data.append(row) 13 14#配列から1~131の数字を検索して無い数字だけリストアップ 15for i in range(131): 16 flag= i in data 17 if flag==False: 18 new_data.append(i) 19#リスト出力 20print(new_data) 21

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

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

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

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

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

TakaiY

2020/12/05 14:55

CSVの中身と書いてあるものは、本当にdata.csvファイルの中身ですか? そうであれば、これは通常のCSVファイルではないので、中に入っている数値に言えるデータを数値として扱うには工夫が必要になります。 そうでないなら、本当のdata.csvの中身を貼りつけてください。
guest

回答2

0

分からない場合は、対話モードで確認してみたほうが良いと思います。

python

1>>> import csv 2>>> f = open("data.csv","r",encoding="SHIFT-JIS") 3>>> reader = csv.reader(f) 4>>> data = [ e for e in reader ]

このあとdataは何か確認してみましょう。

python

1>>> print(data) 2[["[['1']", " ['5']", " ['15']", " ['16']", " ['18']", " ['27']", " ['28']", " ['29']", " ['58']", " ['61']", " ['62']", " ['62']", " ['63']", " ['64']", " ['65']", " ['66']", " ['71']", " ['72']", " ['74']", " ['75']", " ['76']", " ['77']", " ['78']", " ['79']", " ['80']", " ['81']", " ['82']", " ['84']", " ['85']", " ['86']", " ['87']", " ['88']", " ['89']", " ['90']", " ['91']", " ['92']", " ['93']", " ['94']", " ['95']", " ['96']", " ['97']", " ['98']", " ['99']", " ['100']", " ['101']", " ['1203651161']", " ['1200105667']", " ['102']", " ['103']", " ['104']", " ['105']", " ['106']", " ['107']", " ['108']", " ['109']", " ['110']", " ['111']", " ['112']", " ['113']", " ['113']", " ['114']", " ['115']", " ['116']", " ['117']", " ['118']", " ['119']", " ['120']", " ['121']", " ['122']", " ['123']", " ['124']", " ['125']", " ['126']", " ['127']", " ['128']", " ['129']", " ['130']]"]]

リストに見えますね。リストの長さ(要素数)を調べてみます。

python

1>>> len(data) 21

長さは1、つまりこのリストの要素は一個だけです。
amkさんの想定していたものと同じでしょうか。
amkさんのプログラムは、数字とdata[0]というリストを比べています。

そこで、data2.csvを以下のように作ってみました。(・・・は省略で本当は77行あります)

csv

11 25 3・・・ 4130

これを読み込んで表示してみます。

python

1>>> f2 = open("data2.csv","r",encoding="SHIFT-JIS") 2>>> reader2 = csv.reader(f2) 3>>> data2 = [ e for e in reader2 ] 4>>> print(data2) 5[['1'], ['5'], ['15'], ['16'], ['18'], ['27'], ['28'], ['29'], ['58'], ['61'], ['62'], ['62'], ['63'], ['64'], ['65'], ['66'], ['71'], ['72'], ['74'], ['75'], ['76'], ['77'], ['78'], ['79'], ['80'], ['81'], ['82'], ['84'], ['85'], ['86'], ['87'], ['88'], ['89'], ['90'], ['91'], ['92'], ['93'], ['94'], ['95'], ['96'], ['97'], ['98'], ['99'], ['100'], ['101'], ['1203651161'], ['1200105667'], ['102'], ['103'], ['104'], ['105'], ['106'], ['107'], ['108'], ['109'], ['110'], ['111'], ['112'], ['113'], ['113'], ['114'], ['115'], ['116'], ['117'], ['118'], ['119'], ['120'], ['121'], ['122'], ['123'], ['124'], ['125'], ['126'], ['127'], ['128'], ['129'], ['130']]

これは、amkさんの想定していたものと同じでしょうか。
data2は、data2.csvの各行から改行を取り除いた文字列を要素とするリストのリストです。
data2.scvが77行あるので、data2の長さは77です。

data2.csvを使うことにしたとします。

data2の最初の要素data2[0]は ['1']というリストです。
1はdata2の中にあるでしょうか?

python

1>>> i=1 2>>> flag = i in data2 3>>> print(flag) 4False

見つからないようです。なになら見つかるかと試してみると

python

1>>> i=['1'] 2>>> flag = i in data2 3>>> print(flag) 4True

見つかりました。

ここから先は自力で考えてみてください。

投稿2020/12/05 09:07

編集2020/12/05 09:08
ppaul

総合スコア24670

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

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

0

質問欄にある[['1'],,,,が変数dataの中身だとするならば、次の点で問題があります。
これらの内容を元にデータ構造と型の現状を把握したうえで、正しいコードが何かを考えないといけません。

中身が文字列型なのに、数値型を検索しようとしている

inは少なくとも型レベルまでは厳密に見て存在判定をしています。

そのため、dataの中身が数値ではなく文字列なのに対して、rangeから得ている数値型では引っかかることはありません。必ずFalseになります。

sample

python

1>>> 1 in [1] 2True 3>>> 1 in [1] 4True 5>>> 1 in ['1'] 6False 7>>> '1' in ['1'] 8True

配列の配列から検索しようとしている

data中身は単なる配列ではなく、「『文字列を持つ配列』の配列」となっています。
そのため、i in dataでTrueを期待するためには、少なくともiの側も文字列を持つ配列でないと意味がありません。

python

1>>> '1' in [['1']] 2False 3>>> ['1'] in [['1']] 4True

投稿2020/12/05 07:36

attakei

総合スコア2740

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問