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

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

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

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

Q&A

解決済

2回答

569閲覧

pythonでの文字列のリスト化

yhgkemry

総合スコア3

Python

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

0グッド

0クリップ

投稿2020/09/03 19:26

編集2020/09/04 01:24

前提・実現したいこと

'Toyota3.50, 4.99, Honda0.87, 1.49, Matsuda2.68, 3.99, Nissan1.41, 1.99'
この文字列を下記のリストにしたいです。

["Toyota", 3.50, 4.99, "Honda", 0.87, 1.49, "Matsuda", 2.68, 3.99, "Nissan", 1.41, 1.99]

英字と数字が混在している文字列で、英字はstrとして、数字(float)はfloatとしてリスト化する方法を求めています。

下記が最も近いのかなと思い、あてはめようと試みているのですが、うまくいかず止まっている状況です。
https://teratail.com/questions/37813

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

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

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

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

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

tachikoma

2020/09/03 21:46

リストとありますが、[]を含めてすべて文字列の状態からのスタートして、特定の文字列の前後に""を置いた文字列にしたいということでしょうか。
yhgkemry

2020/09/03 22:26

紛らわしい書き方となり申し訳ありません。 スタートは[]は含めず、すべて文字列の状態からスタートして、特定の文字列の前後に””と,入れたうえで、リストにするのが最終地点です。
otn

2020/09/03 22:35

コードレベルの話で、やりたいことを説明してください。 > [Toyota3.50, 4.99, Honda0.87, 1.49, Matsuda2.68, 3.99, Nissan1.41, 1.99] が、Pythonの文法に合ってないことは理解できていますか?
yhgkemry

2020/09/03 22:45

理解しております。 "Toyota3.50, 4.99, Honda0.87, 1.49, Matsuda2.68, 3.99, Nissan1.41, 1.99" という文字列を、 ["Toyota",3.50, 4.99, "Honda", 0.87, 1.49, "Matsuda" ,2.68, 3.99, "Nissan", 1.41, 1.99] というリストにするのが最終目標です。
tachikoma

2020/09/03 22:50

カンマセパレートというわけではないので、そうすると文字列の走査が必要になってちょっと面倒ですね。ちなみに何か試してみましたか?
yhgkemry

2020/09/03 23:23

おっしゃる通りカンマセパレートであれば、すぐにできたのですが。 下記が最も近いのかなと思い、あてはめようと試みているのですが、うまくいかず止まっている状況です。 https://teratail.com/questions/37813
otn

2020/09/03 23:35 編集

> という文字列を、 質問を書き直しましょう。やりたいことは「ダブルクォーテーションとカンマの追加」ではないことは理解できましたか? > あてはめようと試みているのですが、うまくいかず止まっている状況です。 の状況も質問に追記しましょう。
guest

回答2

0

ベストアンサー

カンマは無視して、欲しいものを抽出します。

Python

1import re 2 3a = "Toyota3.50, 4.99, Honda0.87, 1.49, Matsuda2.68, 3.99, Nissan1.41, 1.99" 4 5b = [float(x) if re.match(r"\d",x) else x for x in re.findall(r"\d+.\d+|[A-Za-z]+",a)] 6 7print(b)

投稿2020/09/03 23:56

otn

総合スコア84423

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

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

yhgkemry

2020/09/04 01:14

ありがとうございます。 内包表記が私にはパッと見た際に理解が追い付かなかったので、下記のようにしました! import re a = "Toyota3.50, 4.99, Honda0.87, 1.49, Matsuda2.68, 3.99, Nissan1.41, 1.99" b = [] for x in re.findall(r"\d+.\d+|[A-Za-z]+",a): if re.match(r"\d",x): b.append(float(x)) else: b.append(x)
guest

0

各文字に対してisalphaisnumericを使ってやると便利です。下記のコードでは文字列を左から順番に走査してアルファベットから始まるか数字から始まるかで条件分岐をかけています。コメントと合わせて追いかけてみてください。

Python

1def custom_separator(s): 2 rst = [] 3 4 idx = 0 5 l = len(s) 6 while idx < l: 7 temp = "" # 現在のtoken 8 if s[idx].isalpha(): # もしアルファベットで始まるなら 9 temp += '"' # 先頭に"を加える 10 while idx < l and s[idx].isalpha(): 11 temp += s[idx] 12 idx += 1 13 temp += '"' # 末尾にも"を加える 14 rst.append(temp) 15 elif s[idx].isnumeric(): # もし数字から始まるなら 16 # 次の条件分の外側のカッコ()は省略できない。 17 while idx < l and (s[idx].isnumeric() or s[idx] == "."): # カンマも含める 18 temp += s[idx] 19 idx += 1 20 rst.append(temp) 21 else: # それ以外から始まる文字列は無視する 22 idx += 1 23 return rst 24 25s = """Toyota3.50, 4.99, Honda0.87, 1.49, Matsuda2.68, 3.99, Nissan1.41, 1.99""" 26 27lst = custom_separator(s) 28print(lst) 29# ['"Toyota"', '3.50', '4.99', '"Honda"', '0.87', '1.49', '"Matsuda"', '2.68', '3.99', '"Nissan"', '1.41', '1.99']

ここまででtokenに分解して文字列は"で囲むリストができます。あとはこれを, カンマで結合する。

python

1dst = ", ".join(lst) 2print(dst) 3# "Toyota", 3.50, 4.99, "Honda", 0.87, 1.49, "Matsuda", 2.68, 3.99, "Nissan", 1.41, 1.99

フォーマットがかなり扱いにくいのですし、この種の走査はPythonだと処理が遅くなりやすいので、できれば前の段階でもう少し整形できないか検討したほうがいいかもしれません。

投稿2020/09/03 23:33

tachikoma

総合スコア3601

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

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

yhgkemry

2020/09/04 01:43

ありがとうございます。 コメントまでつけていただき大変助かりました! やはりデータの段階でうまく整備することを考えた方がよさそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問