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

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

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

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

917閲覧

リストの内容を文字列から数値に変換したい

taiyo2017

総合スコア170

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2018/11/01 05:08

li[i]に文字列の数字(例えば'3')が入っているリストliがあります。たまにli[i]に文字列が入っていることがあります。

for i in range(len(li)): li[i]=int(li[i])

とコードを書いて実行すると、
ValueError: could not convert string to int: 'あいう'と文字列が入っているところでエラーが出てしまいます。なぜエラーが発生してしまうかは理解しています。エラーが発生したら、そのli[i]をリストから削除しするようにしたいのですが、どのようにコードを書けばいいでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

intに変換してみて例外発生しなければ(別)リストに追加という手法もアリです。

Python

1ss = ['1', '2', 'あいう', '3', 'a', '', ' -4 ', '1.2'] 2ns = [] 3for s in ss: 4 try: 5 ns.append(int(s)) 6 except ValueError: 7 pass 8 9print(ns) # [1, 2, 3, -4]

kichirb3さんの指摘をうけ追記

Python3.6からは1_234_567のように数値の間にアンダースコアが入っていても1234567正常に変換できるようになっていることに注意が必要です。
このアンダースコアは、数値を人間にとって見やすくするための区切り(3桁区切りなど)として利用されることを考慮して導入されました。実際の変換ではアンダースコアは無視されます。
これを否と判定するには独自にアンダースコアの有無チェックなりを独自で行う必要がありそうです(int変換時、引数で制御できればよいのですが)。
詳細はPEP 515 -- Underscores in Numeric Literalsを参照ください。

投稿2018/11/01 05:51

編集2018/11/01 08:38
can110

総合スコア38260

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

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

退会済みユーザー

退会済みユーザー

2018/11/01 08:17

最近のpython(3.6以降?)だと、'2018_11_01' のように数字の間にアンダースコアが入っている文字列でもint()で例外を発生させずに変換できてしまうので注意が必要と思います。
can110

2018/11/01 08:25

再現確認できました。3.5ではTypeError、3.6では変換できますね。 [PEP 515 -- Underscores in Numeric Literals](https://www.python.org/dev/peps/pep-0515/) が関係してそうですね。少し調べてみます。 ご指摘ありがとうございます。
guest

0

str.isdigit() で文字列が数字かどうか判断できるので、数字の文字列だけ int() に変換したリストを再構成したいのであれば、次のようにするといいかと思います。

python

1lst = ['1', '2', 'あいう', '3', 'a'] 2lst = [int(v) for v in lst if v.isdigit()] 3print(lst) # [1, 2, 3]

追記

ご指摘いただいた通り、符号を含む数値は isdigit() では False になってしまい、駄目でした。標準関数で数値かどうか判断できる関数がないのか探してみたのですが、なさそうですね。
can110 さんが提案されたやり方が正着と思われます。

str.isdecimal(): 全ての文字が十進数字なら真、そうでなければ偽
半角・全角のアラビア数字が真
str.isdigit(): 全ての文字が数字なら真、そうでなければ偽
半角・全角のアラビア数字、特殊数字が真
str.isnumeric(): 全ての文字が数を表す文字なら真、そうでなければ偽
半角・全角のアラビア数字、特殊数字、漢数字が真

引用元

python

1def is_int(v): 2 try: 3 num = int(v) 4 except ValueError: 5 return False 6 return True 7 8lst = ['1', '-2', 'あいう', '-3', 'a'] 9lst = [int(v) for v in lst if is_int(v)] 10print(lst) # [1, 2, 3]

投稿2018/11/01 05:29

編集2018/11/01 06:15
tiitoi

総合スコア21956

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

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

can110

2018/11/01 05:52

負値の場合の考慮が必要かと思います。
tiitoi

2018/11/01 06:16 編集

isdigit() は符号が含むと駄目だったのですね。 標準関数でないのか調べてみたのですが、ちょうどいい関数が無さそうなので、 can110 さんのやり方が最善と思われます。 教えていただきありがとうございます。
can110

2018/11/01 06:20

意外なことに無いようなのです。 pandasのみなら型変換時に'ignore'指定あたりで出来そうなのですが。
taiyo2017

2018/11/01 06:32

承知しました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問