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

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

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

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

Q&A

解決済

3回答

7453閲覧

Python3 複数行データに文字と数値が混在した場合でも文字と数値として1度に入力することが可能なのか?

opyon

総合スコア1009

Python 3.x

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

0グッド

0クリップ

投稿2018/09/25 08:09

オンラインの問題などでよくあるパターンなのですが、
1行目にN=その後にあるデータの行数
2行目以降は空白区切りで複数個のデータを含む行がN行など

Python3

1sample = [list(map(int, input().split())) for i in range(N)]

例えば入力データが全て整数であれば上記のように**map(int, input().split())**を使えば良いのですが、
文字と数値が混在してる場合このままで1度に入力処理させると文字を含むので当然エラーとなります。

####知りたいこと
複数行データに文字と数値が混在した場合でも文字と数値として1度に入力することが可能なのか?
そのような方法が無いという回答でも構いません。
ヒントやアドバイスあればご教示頂けると助かります。

####やったこと
プログラミング(競プロ)に便利な Python3 用法集 入力編
上記サイトを参考にしてもやはり複数行で文字と数値の混在パターンのサンプルコードはありませんでした。
現状は一旦文字列としてリストに取り込み、その後for文で全要素をint()やfloat()で処理して上書きしています。

入力データ
3
a 1.23
b 2.34
c 3.45

Python3

1N = int(input().rstrip()) 2src = [list(input().split()) for _ in range(N)] 3print(src) 4for row in src: 5 row[1] = float(row[1]) 6print(src)

出力(リストの中身確認)
[['a', '1.23'], ['b', '2.34'], ['c', '3.45']]
[['a', 1.23], ['b', 2.34], ['c', 3.45]]

####環境
Python 3.7.0 or 3.6.6

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

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

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

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

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

guest

回答3

0

こういう強引な方法も。

Python

1def cast_data(datum): 2 assert isinstance(datum, str) 3 4 if datum.isdigit(): 5 return int(datum) 6 try: 7 return float(datum) 8 except ValueError: 9 return datum 10 11 12N = int(input()) 13data = [ 14 [ 15 cast_data(datum) for datum in input().split() 16 ] 17 for _ in range(N) 18] 19 20print(data)

実行結果 Wandbox

[['a', 1.23], ['b', 2.34], ['c', 3.45]]

汎用性はともかく実行効率は良くないと思います。計測しないと何とも言えませんが。

投稿2018/09/25 08:35

LouiS0616

総合スコア35660

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

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

opyon

2018/09/25 08:44

ありがとうございます。 ちょっと読み解くのに時間がかかりそうですが今後の参考になりそうな予感がします。
guest

0

ベストアンサー

それ用の関数を定義すれば簡単です。

python

1def f(s): 2 lst = s.split() 3 return lst[0], float(lst[1]) 4 5sample = [f(input()) for i in range(N)]

その気になればlambdaで書けます。メリットは特にありません。

python

1sample = [(lambda s_lst: (s_lst[0], float(s_lst[1])))(input().split()) for i in range(N)]

投稿2018/09/25 08:16

hayataka2049

総合スコア30933

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

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

opyon

2018/09/25 08:22

ありがとうございます。どちらも目から鱗です><. 因みにこれを検索しようとするとどのようなキーワードが思いつきますか? 自分なりには検索してみたつもりだったのですが辿り着けずに質問させて頂きました。
hayataka2049

2018/09/25 08:28

キーワードは、思いつきません お力になれなくてすみません
opyon

2018/09/25 08:32

いえいえとんでもないです。ありがとうございました。 頂いたコードをある程度パターン化しておいて問題に挑みたいと思います。
hayataka2049

2018/09/25 08:35

こういう部分は、多少泥臭く書いてもべつに良いような気がします。慣れてきたらスマートな書き方を模索してみる程度で あとはatcoderとかなら、同じ言語で書いている他の人のコードをのぞき見すると色々ヒントが得られるかもしれません
opyon

2018/09/25 08:43

for文を何度も使った泥臭い方法はなんとかなることもあるのですが。 atcoderはまだほとんど使ったことがないですが、なるほど確かに覗くのが近道かもしれませんね。
guest

0

scanf を使いたいということでしょうか?

参考情報

  • Pythonにおける標準入力について(scanfみたいに使いたい)

https://teratail.com/questions/57605

  • pythonでscanf的なことをする

https://hayataka2049.hatenablog.jp/entry/2018/04/10/155957

scanf は、 pip3 install scanf をすれば、後はこんなふうに使えます。
イメージ説明

投稿2018/09/25 14:47

編集2018/09/25 14:50
katoy

総合スコア22324

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

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

opyon

2018/09/25 15:02

>以上を読んで、それでもscanf()を使いたい、自分にはscanf()しかない、と思うのなら、 >モジュールをインストールすればできます。 >PyPI: scanf ありがとうございます。 質問した時はjavaみたいにscanfあればいいなと思っていました。(よく分かりましたね) どうしてもscanfを使いたいわけではないので教えていただいた別の方法を使うつもりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問