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

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

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

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

Python

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

Q&A

解決済

3回答

1217閲覧

python listのstr型の内容を数字だけfloat型に変更し、要素ごとに区切りたい。

BigCulture

総合スコア2

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2021/12/09 02:34

前提・実現したいこと

python listの内容を数字だけfloat型に変更し、要素ごとに区切りたい。

該当のソースコード

python

1Products_Data = [['手巻おにぎり追い鰹仕立て北海道産昆布', '110', '173', '3.3', '0.8', '39.1', '37', '2.1', '1.1'], 2 ['手巻おにぎり鳥めし', '125', '200', '6.1', '1.5', '41.3', '39.5', '1.8', '2.4'], 3 ['手巻おにぎり鰹の香り引き立つおかか', '105', '166', '4.5', '0.9', '35.7', '34', '1.7', '1.3']] 4 5New_Products_Data = [] 6 7for Product_Data in Products_Data: 8 for i in range(len(Product_Data)): 9 r = Product_Data[i] 10 try: 11 New_Products_Data.append(float(r)) 12 except: 13 New_Products_Data.append(r) 14 15New_Products_Data 16

出力結果

python

1 2['手巻おにぎり追い鰹仕立て北海道産昆布', 3 110.0, 4 173.0, 5 3.3, 6 0.8, 7 39.1, 8 37.0, 9 2.1, 10 1.1, 11 '手巻おにぎり鳥めし', 12 125.0, 13 200.0, 14 6.1, 15 1.5, 16 41.3, 17 39.5, 18 1.8, 19 2.4, 20 '手巻おにぎり鰹の香り引き立つおかか', 21 105.0, 22 166.0, 23 4.5, 24 0.9, 25 35.7, 26 34.0, 27 1.7, 28 1.3] 29

望んでいる出力結果

python

1 2[['手巻おにぎり追い鰹仕立て北海道産昆布', 3 110.0, 4 173.0, 5 3.3, 6 0.8, 7 39.1, 8 37.0, 9 2.1, 10 1.1], 11 ['手巻おにぎり鳥めし', 12 125.0, 13 200.0, 14 6.1, 15 1.5, 16 41.3, 17 39.5, 18 1.8, 19 2.4], 20 ['手巻おにぎり鰹の香り引き立つおかか', 21 105.0, 22 166.0, 23 4.5, 24 0.9, 25 35.7, 26 34.0, 27 1.7, 28 1.3]] 29

手巻おにぎり追い鰹仕立て北海道産昆布のような文字列はそのままstr型

その他の'110', '173', '3.3', '0.8', '39.1', '37', '2.1', '1.1'のような値はfloat型に変更したい

また出力結果をProducts_Dataのような要素ごとのリスト形式に格納したいです

よろしくお願いいたします

試したこと

map関数を用いた。

過去の自分の投稿を元にコードを書いてみたが、うまく実装できなかった。

参考リンク

補足情報(FW/ツールのバージョンなど)

python 3.x

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

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

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

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

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

guest

回答3

0

ベストアンサー

3案、回答します。

コード例1

python3

1import re 2 3Products_Data = [['手巻おにぎり追い鰹仕立て北海道産昆布', '110', '173', '3.3', '0.8', '39.1', '37', '2.1', '1.1'], 4 ['手巻おにぎり鳥めし', '125', '200', '6.1', '1.5', '41.3', '39.5', '1.8', '2.4'], 5 ['手巻おにぎり鰹の香り引き立つおかか', '105', '166', '4.5', '0.9', '35.7', '34', '1.7', '1.3']] 6 7New_Products_Data = [ 8 [float(x) if re.match(r'\d+(.\d+)?', x) else x for x in Product_Data] 9 for Product_Data 10 in Products_Data 11] 12 13print(New_Products_Data) 14

出力結果:

[['手巻おにぎり追い鰹仕立て北海道産昆布', 110.0, 173.0, 3.3, 0.8, 39.1, 37.0, 2.1, 1.1], ['手巻おにぎり鳥めし', 125.0, 200.0, 6.1, 1.5, 41.3, 39.5, 1.8, 2.4], ['手巻おにぎり鰹の香り引き立つおかか', 105.0, 166.0, 4.5, 0.9, 35.7, 34.0, 1.7, 1.3]]

コード例2

もしくは、map を使ってみるということでしたら、

pyhon3

1Products_Data = [['手巻おにぎり追い鰹仕立て北海道産昆布', '110', '173', '3.3', '0.8', '39.1', '37', '2.1', '1.1'], 2 ['手巻おにぎり鳥めし', '125', '200', '6.1', '1.5', '41.3', '39.5', '1.8', '2.4'], 3 ['手巻おにぎり鰹の香り引き立つおかか', '105', '166', '4.5', '0.9', '35.7', '34', '1.7', '1.3']] 4 5 6def to_float_if_possible(x): 7 try: 8 return float(x) 9 except ValueError: 10 return x 11 12 13New_Products_Data = [ 14 [*map(to_float_if_possible, Product_Data)] 15 for Product_Data 16 in Products_Data 17] 18 19print(New_Products_Data) 20 21

出力結果:

[['手巻おにぎり追い鰹仕立て北海道産昆布', 110.0, 173.0, 3.3, 0.8, 39.1, 37.0, 2.1, 1.1], ['手巻おにぎり鳥めし', 125.0, 200.0, 6.1, 1.5, 41.3, 39.5, 1.8, 2.4], ['手巻おにぎり鰹の香り引き立つおかか', 105.0, 166.0, 4.5, 0.9, 35.7, 34.0, 1.7, 1.3]]

コード例3

もうひとつ。与えられるProducts_Dataが含む各リストの要素は、

  • 先頭だけがfloat変換の対象外の文字列。2番目以降はfloatに変換できる数字の文字列である

ことを前提にしてよいのであれば以下でもよいかと思います。

python3

1New_Products_Data = [[product, *map(float, data)] for product, *data in Products_Data]

投稿2021/12/09 02:48

編集2021/12/09 04:00
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

BigCulture

2021/12/09 03:50

ありがとうございます。 コード例3の前提で問題ございません。 3案も回答してくださりありがとうございました。
guest

0

コンパクトな回答が出てますが、元のプログラムの修正で行くなら、

Python

1for Product_Data in Products_Data: 2 x = [] 3 for i in range(len(Product_Data)): 4 r = Product_Data[i] 5 try: 6 x.append(float(r)) 7 except: 8 x.append(r) 9 New_Products_Data.append(x)

また、

Python

1 for i in range(len(Product_Data)): 2 r = Product_Data[i]

は、iを元のリストの添え字でしか使ってないので、

Python

1 for r in Product_Data:

が普通です。外側のforでは出来ているのに何故??
また、この程度のことでtryexceptを使うことも普通は無いでしょう。ifで判断すべき。

投稿2021/12/09 05:34

編集2021/12/09 09:03
otn

総合スコア84806

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

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

BigCulture

2021/12/09 08:56

otn様 回答ありがとうございます。 勉強になりました。
guest

0

以下のようにします。

python

1def to_float(s): 2 try: 3 return float(s) 4 except: 5 return s 6 7New_Products_Data = [[to_float(s) for s in pd] for pd in Products_Data]

実行結果

python

1>>> from pprint import pprint 2>>> 3>>> New_Products_Data = [[to_float(s) for s in pd] for pd in Products_Data] 4>>> pprint(New_Products_Data) 5[['手巻おにぎり追い鰹仕立て北海道産昆布', 110.0, 173.0, 3.3, 0.8, 39.1, 37.0, 2.1, 1.1], 6 ['手巻おにぎり鳥めし', 125.0, 200.0, 6.1, 1.5, 41.3, 39.5, 1.8, 2.4], 7 ['手巻おにぎり鰹の香り引き立つおかか', 105.0, 166.0, 4.5, 0.9, 35.7, 34.0, 1.7, 1.3]]

投稿2021/12/09 03:59

ppaul

総合スコア24666

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

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

BigCulture

2021/12/09 04:19

ppaul様 回答ありがとうございます。 try exceptをしたあとに内包表記で表現する方法は思いつきませんでした。 ご丁寧に回答をいただきまして、本当にありがとうございました。 おかげさまで解決することができました。機会がありましたらよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問