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

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

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

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

Q&A

解決済

3回答

1566閲覧

python 文字列から数値への変換 リスト内包表記

yamatail

総合スコア77

Python 3.x

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

0グッド

0クリップ

投稿2018/07/05 07:51

前提・実現したいこと

スマートなコーディングをマスターしたい。

発生している問題・エラーメッセージ

テキストで読み込んできた数値データがリストとしてあります。
数値には、intとfloatが混ざっておりそれが文字列として読み込まれております。

それを、数値データとして取り扱いたいため数値に直すコードを書きました。
一応いろいろ調べて書いて出来たのですが、なんんか長ったらしくなってしまいます。

リスト内包表記も知っておりますが、まだ知識が浅いため困っております。

何か上手な書き方がございました、アドバイスお願い致します。

該当のソースコード

python

1list1 = [["0","1.5","2","3.5","4","5.5"],["0.005","1","2","3","4.2","5"]] 2data = [] 3for index,i in enumerate(list1): 4 data_ele = [] 5 for i1 in i: 6 if i1.isdecimal() == True: 7 c = int(i1) 8 else: 9 try: 10 c = float(i1) 11 except: 12 c = i1 13 data_ele.append(c) 14 data.insert(index,data_ele) 15print(data)

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

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

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

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

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

guest

回答3

0

読めないですけど。

python

1list1 = [["0","1.5","2","3.5","4","5.5"],["0.005","1","2","3","4.2","5"]] 2data = [[*map(lambda s: "." in s and float(s) or int(s), inner)] for inner in list1]

投稿2018/07/05 08:22

YouheiSakurai

総合スコア6142

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

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

yamatail

2018/07/05 08:36

たくさん方法あるのですね! 解読するだけでも勉強になりそうです。 教えて頂き、どうもありがとうございます!
guest

0

int, floatを混ぜて変換をとなると、長くなってしまうのは仕方ない気はします。
if文による分岐でそれぞれint, floatに変換をしてリストに格納するのがいい思います。

LouiS0616さんも言っているように、全てfloatにしておくほうがいいと思います。
一括floatであればこんなリスト内包表記はいかがでしょうか?

python

1list1 = [["0","1.5","2","3.5","4","5.5"],["0.005","1","2","3","4.2","5"]] 2[list(map(float, l)) for l in list1]

投稿2018/07/05 08:18

Laplusdestiny

総合スコア25

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

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

yamatail

2018/07/05 08:36

なるほど、c = にするのが手間とうことでしたか! mapとは...調べてみます! 教えて頂き、どうもありがとうございます!
guest

0

ベストアンサー

こんな感じでしょうか。

Python

1data = [] 2for row in list1: 3 datum = [] 4 5 for elem in row: 6 if elem.isdecimal(): 7 datum.append(int(elem)) 8 else: 9 datum.append(float(elem)) 10 11 data.append(datum) 12 13print(data)

内包表記を使うなら

条件式を用いると良いです。

Python

1data = [ 2 [ 3 int(elem) if elem.isdecimal() else float(elem) 4 for elem in inner 5 ] 6 for inner in list1 7]

ただし、整数であるかどうかに関わらずfloatに投げた方が楽ですし、扱いやすいかと思います。

Python

1data = [ 2 [ 3 float(elem) for elem in inner 4 ] 5 for inner in list1 6] 7print(data)

整数であるかの判定は利用時でもできます。

Python

1>>> 3.14 .is_integer() 2False 3>>> 4>>> 42. .is_integer() 5True

投稿2018/07/05 07:57

編集2018/07/05 08:07
LouiS0616

総合スコア35660

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

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

yamatail

2018/07/05 08:11

ご回答ありがとうございます。 こういうスマートな書き方がしてみたいです。がんばって書きます。 もうfloatでよいのですね。確かに。。。 ちなみにpythonの整数と浮動小数の使い分けは、どのようになさってますか? 基本、floatで完全に整数のとき(回数とか)だけintで書くという感じなのでしょうか?
LouiS0616

2018/07/05 08:16

離散値か連続値かの違いですね。 連続値である場合は、たとえ整数で表現できるとしても浮動小数を用いた方が自然です。 どっちで表現するか迷うことはあまりないです。
yamatail

2018/07/05 08:23

数値の形ではなく、状況と意味を考えて使い分けるんですね。なんとなく理解できます。 とにかく内包表記と睨めっこして他でも応用して使えるように練習します。 ご丁寧に教えて頂き、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問