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

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

ただいまの
回答率

90.51%

  • Python 3.x

    6450questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 135

yamatail

score 19

 前提・実現したいこと

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

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

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

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

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

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

 該当のソースコード

list1 = [["0","1.5","2","3.5","4","5.5"],["0.005","1","2","3","4.2","5"]]
data = []
for index,i in enumerate(list1):
    data_ele = []
    for i1 in i:
        if i1.isdecimal() == True:
             c = int(i1)
        else:
            try:
                c = float(i1)
            except:
                c = i1
        data_ele.append(c)
    data.insert(index,data_ele)
print(data)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

こんな感じでしょうか。

data = []
for row in list1:
    datum = []

    for elem in row:
        if elem.isdecimal():
            datum.append(int(elem))
        else:
            datum.append(float(elem))

    data.append(datum)

print(data)

内包表記を使うなら

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

data = [
    [
        int(elem) if elem.isdecimal() else float(elem)
        for elem in inner
    ]
    for inner in list1
]

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

data = [
    [
        float(elem) for elem in inner
    ]
    for inner in list1
]
print(data)

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

>>> 3.14 .is_integer()
False
>>>
>>> 42. .is_integer()
True

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/05 17:11

    ご回答ありがとうございます。
    こういうスマートな書き方がしてみたいです。がんばって書きます。

    もうfloatでよいのですね。確かに。。。

    ちなみにpythonの整数と浮動小数の使い分けは、どのようになさってますか?
    基本、floatで完全に整数のとき(回数とか)だけintで書くという感じなのでしょうか?

    キャンセル

  • 2018/07/05 17:16

    離散値か連続値かの違いですね。
    連続値である場合は、たとえ整数で表現できるとしても浮動小数を用いた方が自然です。

    どっちで表現するか迷うことはあまりないです。

    キャンセル

  • 2018/07/05 17:23

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

    ご丁寧に教えて頂き、ありがとうございました。

    キャンセル

+2

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/05 17:36

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

    キャンセル

+2

読めないですけど。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/05 17:36

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

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    連続した数字の和を求めたい

    Python2.7を使っています。 text.txtというファイルがあり、中には数字が羅列しています。 1234680...といった具合です。 これらの和を求めようとしていま

  • 解決済

    標準入力で1行にある複数の数字をリスト化

    標準入力で 1.2 2.4 3.6 のようにスペースで区切られた数字があります。 これを読み込んで、数値のリストにするにはどうすればいいですか? 自分なりに下記のよ

  • 解決済

    文字列を比較して配列に格納できない

    ans配列の要素の文字列の最初の文字がlinesの要素の最初の文字と一致するならlinesの2番目の要素('A'/'B'/'C'/'D')をline_alpha配列に格納する、とい

  • 解決済

    pythonのスライスについて

    a = b[:,0] このようなコードがあったとき、どのようなことがおこなわれますか? bはこのコードがなりたつ何かだとすると なにだったら成り立ちますか? すみません、間

  • 解決済

    縦長の標準出力をリスト化して、降順に並べたい

    皆様いつもお世話になっております。 下記の改行区切りで縦長になっている数列を、小さい順に並べるという問題なのですが、 5 3 5 19 1 2 これを変数に代入することは出

  • 解決済

    辞書を小さいもの順にソートしたい

    辞書を小さいもの順にソートしたい。 df変数に {"A": [{"a": 100}, {"b": 200}, {"c": 300}], "B": [{"a": 400}, {"

  • 解決済

    構造の異なる辞書をソートしたい

    構造の異なる辞書をソートしたい。 辞書dfには df = [{"A":{"A1":{"a1":100,"b1":200,"c1":300}}},{"B":{"B1":{"a2"

  • 解決済

    Pythonで複数の配列内の要素同士を足し合わせたい

    言語:python 実行環境:Anaconda、Win10 プログラミング初心者です。 会社で必要に迫られて簡単なツール作りをやることになりましたが行き詰っています。 実現

同じタグがついた質問を見る

  • Python 3.x

    6450questions

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