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

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

ただいまの
回答率

90.51%

  • Python 3.x

    9829questions

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

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

解決済

回答 3

投稿

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

opyon

score 969

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

sample = [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

N = int(input().rstrip())
src = [list(input().split()) for _ in range(N)]
print(src)
for row in src:
    row[1] = float(row[1])
print(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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+2

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

def f(s):
    lst = s.split()
    return lst[0], float(lst[1])

sample = [f(input()) for i in range(N)]

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/09/25 17:22

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

    キャンセル

  • 2018/09/25 17:28

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

    キャンセル

  • 2018/09/25 17:32

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

    キャンセル

  • 2018/09/25 17:35

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

    キャンセル

  • 2018/09/25 17:43

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

    キャンセル

+2

こういう強引な方法も。

def cast_data(datum):
    assert isinstance(datum, str)

    if datum.isdigit():
        return int(datum)
    try:
        return float(datum)
    except ValueError:
        return datum


N = int(input())
data = [
    [
        cast_data(datum) for datum in input().split()
    ]
    for _ in range(N)
]

print(data)

実行結果 Wandbox

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/09/25 17:44

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

    キャンセル

0

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

参考情報

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/09/26 00:02

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

    キャンセル

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

  • Python 3.x

    9829questions

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