

python3で複数の数値をinputから取得したいのですが下記の二つを試してもうまく動きません。なぜでしょうか？

例1

[code]

    s = input().split() #s_1 s_2を分割して取得し、sに値を入れる
    print(s) #出力：['s_1', 's_2']
    print(s[0]) #出力：s_1
    print(s[1]) #出力：s_2
    print(s[2]) #出力：s_3
    
[/code]

例2

[code]

    a,b,c = map(int,input().split())
    
    print(a+b+c)
    
[/code]

出力 下記のように出したいです。

[code]

    5　8 7
    
    20
    
[/code]

他にいい方法があれば教えてください。よろしくお願いします。


CC BY-SA 4.0
2019-02-25T12:10:13.867
53030
2021-12-30T03:34:31.117
2019-02-25T12:37:33.470
19110
32316
question
python python3
複数の数値をinputで一行で取得したい


[マルチポスト先](https://teratail.com/questions/176403) のコメントのように
**入力した文字列と表示されたエラーメッセージ** を明記すると回答を得やすくなると思います。

`a,b,c = map(int,input().split())`にて、入力が二つの時に`alueError: need more than 1
value to unpack`が出ることが問題ならば、[アスタリスク*を使ったアンパック](https://note.nkmk.me/python-
tuple-list-unpack/)で解決できるかもしれません。(python3以降のみ)

上記リンク先で「アスタリスク*を使ったアンパック」をページ内検索すると、下記のように配列要素が2個でもエラーにならないコーディングをすることができます。

[code]

    s = "5　8" #inputの代わりに再現性のある文字列代入を行っています
    a, b, *c = map(int, s.split())
    print(a, b, c)
    # 5 8 []
    
[/code]

ただしアスタリスク付きの引数は値の有無にかかわらず配列として展開されますので、[int型に変換](https://stackoverflow.com/a/31958097)する必要があります。

[code]

    s = "5　8 7" #inputの代わりに再現性のある文字列代入を行っています
    a, b, *c = map(int, s.split())
    print(a, b, c)
    # 5 8 [7]  #cが配列になってしまう
    
    s = "5　8" 
    a, b, *c = map(int, s.split())
    c = c[0] if c else 0  #elseの値は省略時のデフォルト値
    print(a, b, c)
    # 5 8 0
    
[/code]

ちなみに使用できるアスタリスクの数は1つだけです。(複数のアスタリスクを使うと省略時の値をどの変数に入れるか確定できなくなるため)  
そのため変数`b`と`c`にアスタリスクを付けた下記のコードはエラーになるので、不定個の配列要素を許容する場合は別の解決策もご検討ください。

[code]

    a, *b, *c = map(int, s.split())
    
[/code]

> SyntaxError: invalid syntax


CC BY-SA 4.0
2019-02-26T01:10:59.197
53040
2019-02-26T01:18:37.943
2019-02-26T01:18:37.943
3060
9820
53030
answer


「必ず 3 個の入力が与えられるので、その 3 個を受け取りたい」という風に固定長の入力を受け取りたいのであれば、例 2 のプログラムで動くはずです。

[code]

    a, b, c = map(int, input().split())
    print(a + b + c)
    
[/code]

そうではなくて「何個か分からないけど入力が与えられるので、それらを受け取りたい」という風に可変長の入力を受け取りたいのであれば、例 1
と似た感じでリストとして受け取るのが便利です。

[code]

    numbers = list(map(int, input().split()))
    print(numbers [0] + numbers [1] + numbers [2])  # (必ず 3 個は入力があると分かっている場合)
    
[/code]

このように受け取ると、`numbers[0]` に 1 つ目の入力、`numbers[1]` に 2 つ目の入力、`numbers[2]` に 3
つ目の入力、……といった感じで格納されます。入力が何個あったかは `len(numbers)` で調べられます。

## 動作の説明

ところでそもそも、上のプログラムたちはどのようにして入力を受け取っているのでしょうか。この点を理解しておくとエラーの原因を把握しやすくなるので、説明してみます。

  1. まず、`input()` は 1 行の入力を **文字列として** 受け取る関数です。
  2. 受け取った文字列を `split()` することで、空白文字で分割し、 **文字列のリストとして** 受け取ります。
  3. `int()` は文字列を整数値に変換する関数です。`map()` を使うことで、リストの各要素に対してひとつずつ `int()` を適用することができます。この際、`map()` した後の値はリストではなく「イテレーター」というものになります。したがって `map(int, ...)` の部分によって **整数値のイテレーターとして** 受け取ることができます。
  4.     * 固定長の場合、`a, b, c = map( ... )` のように書くことによって、イテレーターの先頭から 3 個 整数値をもらってきてそれぞれ `a`、`b`、`c` に代入します。それぞれの変数には各々ひとつの **整数値** が格納されます。
    * 可変長の場合、イテレーターではなくてリストとしてもらっておくと `numbers[0]` のように添え字付けができるので便利です。`list()` を使うとイテレーターをリストに変換できるので `numbers = list(map( ... ))` のように書くと `numbers` には **整数値のリスト** が格納されます。

具体例で見てみましょう。入力が `5 8 7` だったとすると、それぞれの関数によって以下のように処理されていきます。

[code]

       ↓  input()
    "5 8 7"  (文字列)
       ↓  split()
    ["5", "8", "7"]  (文字列のリスト)
       ↓  map(int, ...)
    [5, 8, 7] を返すようなイテレーター
       ↓  list()
    [5, 8, 7]  (整数値のリスト)
    
[/code]


CC BY-SA 4.0
2019-02-26T04:23:09.617
53046
2021-12-30T03:34:31.117
2021-12-30T03:34:31.117
19110
19110
53030
answer