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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

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

Q&A

解決済

1回答

175閲覧

mysql python 値 取得後比較

syu-yu

総合スコア24

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

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

0グッド

0クリップ

投稿2017/11/16 08:12

やりたいこと:mysqlのデータを取り出し、変数に代入。その後条件を満たしたものを表示。

mysql
table:test
rate | //// |////|...
0.02 | //// |////|...
0.01 | //// |////|...
0.1 | //// |////|...
...

現状:testテーブルより、レートのカラムを取得。表示。
result=fetchall()
for i in result:
print(i)
にてrateの値を取得。
配列を
(0.02,)
(0.01,)
(0.1)
...
と取り出せました。

つまづいていること:条件文でのエラー
for i in result:
if i >= 0.1:
print(i)
とすると、 '>' not supported between instances of 'tuple' and 'float'
とでます。typeでiはtupleだとわかりましたが、その後の対処がわかりません。
通常であれば、取り出せると確認しましたが、取り出した数値に()や,があるのが原因でしょうか?
お手数おかけしますが、よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

添え字アクセスするか

Python

1for i in result: 2 if i[0] >= 0.1: 3 print(i[0])

第一要素以外を読み捨てるか

Python

1for i, *_ in result: 2 if i >= 0.1: 3 print(i)

イテレータをいじるか

Python

1for i in map(lambda x: x[0], result): 2 if i >= 0.1: 3 print(i)

前もってresultを書き換えてしまうか

Python

1result = list(map(lambda x: x[0], result))

よく考えたら、result = next(zip(*result))でも行けますね。

コメントを受けて

1点質問がありまして、2つ目の第一要素以外を読み捨てるかにある「*_」は
どのような意味でしょうか??

確かにこれfor x, *_ in hoge:は初めて見たら戸惑うでしょうね。


アスタリスクの役割
Pythonでは、タプルやリストなどのシーケンスの値を、次のように受け取ることが出来ます。
ただし、最後の行を見てわかるように、要素が一対一対応していなければいけません。

Python

1>>> a, b, c = [1, 2, 3] 2>>> a 31 4>>> b 52 6>>> c 73 8>>> a, b = [1, 2, 3] 9Traceback (most recent call last): 10 File "<stdin>", line 1, in <module> 11ValueError: too many values to unpack (expected 2)

ここで、ある程度まとめて要素を受け取りたいときは、次のように書きます。

Python

1>>> a, *b = [1, 2, 3] 2>>> a 31 4>>> b 5[2, 3]

これで、アスタリスクの役割はわかりましたね。
以前これについて詳しく回答したことがあるので、そちらを見ると理解が深まるかもしれません。
teratail - a,b=hogeというような代入される値が二つあるものの意味


アンダーバーの意味
Pythonの仕様上、アンダーバー単体の命名が認められています。
ですので、ただの変数と思っていただいて大丈夫です。

Python

1>>> _ = 10 2>>> _ 310

ただし、習慣上**『その場で捨てる値』**を示すことが多いです。(REPLを除く)
これについても、以前回答したことがあります。
teratail - tensorflowでアンダースコア(_)に格納する意味


つまり?

Python

1for i, *_ in result: 2 if i >= 0.1: 3 print(i)

「一個目の要素だけほしいな。後は何個あるかわからないけど、とりあえずいらないや」って意味です。

投稿2017/11/16 08:15

編集2017/11/16 09:03
LouiS0616

総合スコア35660

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

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

syu-yu

2017/11/16 08:38

ありがとうございます。 期待通りになりました! 1点質問がありまして、2つ目の第一要素以外を読み捨てるかにある「*_」は どのような意味でしょうか?? 返信いただけましたら幸いです。
LouiS0616

2017/11/16 08:54

いい質問だと思います。追記しておきました。
syu-yu

2017/11/16 09:24

「*」や「_」の意味はわかりました。 ただ、for i,*_ in result;での仕組みがわかっておりません。 「第一要素以外を読み捨てるか」や「一個目の要素だけほしいな」から、第一要素を持ってくることはわかりました。 ただ、その場合、「第一要素しか表示されないのでは?」と疑問が出てきました。 例えば、result=["A","B","C","D"]だとした場合、 for i,*_ in result: だと iにAが入り、残りが*_に格納され、 print(i)→A のみの表示になるのではないかとの意味です。 ただ、実際は A B C D でした。 理解ができておらず、申し訳ありません。 よろしければご解説お願いします。
LouiS0616

2017/11/16 09:41 編集

文字列の場合ちょっと説明がややこしいので、質問の例を再度用います。 resultの中身は、[(0.02,), (0.01,), (0.1,)]のようになっているはずです。 シーケンスの中にシーケンスが入っている二重構造になっています。 ですので、普通にループをぶん回しても、内側のシーケンスが返されるだけです。 もしresultの中身が、[0.02, 0.01, 0.1]のように一重であったなら、 for i in result: で全く問題なく扱えます。 回答中の解決策の一つとして挙げている、『前もってresultを書き換えてしまう』方法は、このようにresultを一重に書き換えようとしているものです。
LouiS0616

2017/11/16 09:45

文字列の例でややこしいと言ったのは、Pythonにおいて文字列とは、『長さ1の文字列のシーケンス』として扱われるためです。 つまり、次のコードは合法です。 for a in "A": ....for b in a: ........for c in b: ............for d in c: 以下永遠に続く。(註:空白をドットで代替しています。) for i,*_ in ["A","B","C","D"]: の場合、 一周目: i, *_ に "A"が代入されようとする ⇒ iは"A"に、_は空のリストになる。 二周目: i, *_ に "B"が代入されようとする ⇒ iは"B"に、_は空のリストになる。 三周目:略 四周目:略
syu-yu

2017/11/16 12:15

ありがとうございます。 例えば、result=[(0.02,), (0.01,), (0.1,)]の時 for i,*_ in result;は、 1周目や2周目はどのように入りますでしょうか? 結果的に 0.02 0.01 0.1と表示されるので、 一周目: i, *_ ⇒ iは0.02、_は空のリスト?になる。 二周目: i, *_ ⇒ iは0.01、_は空のリスト?になる。 三周目:略 でしょうか? 何度もすみませんが、よろしくお願い致します。
LouiS0616

2017/11/16 12:19

その通りです。 _も普通の変数として利用できるので、適宜print(_)して中身を見てみるといいですよ。
syu-yu

2017/11/16 12:21

ありがとうございます! かなり理解できました! 長々と質問してしまい、すみません。 また、丁寧にご解説頂きありがとうございます! 機会がありましたら、また教えて頂ければ幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問