78330


入力した整数の合計数の和が0になったら各整数を2乗し、その和を出力したいと思っています。

例えば以下の通り入力した場合、-3の時点で合計数の和は0となるので1、2、-3のそれぞれの2乗の和を足した14を出力します。

**例1:**

[code]

    1
    2
    -3
    4
    6
    -9
    
[/code]

でも、もし例えば次のように最初に0がある場合は0を出力します。

**例2:**

[code]

    0
    1
    2
    -3
    4
    6
    -9
    
[/code]

そこで、このようなコードを書きました。

[code]

    res = []
    while True:
        num = int(input())
        if sum(res) != 0:
            res.append(num)
        else:
            break
    squares = int(res) ** 2
    print(squares)
    
[/code]

その結果、このようなエラーメッセージが表示されました。

[code]

        squares = int(res) ** 2
    TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
    
[/code]

そこで8行目を次のように書き換えたところ

[code]

       squares = res ** 2
    
[/code]

このようなエラーメッセージが表示されました。

[code]

    TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'
    
[/code]

どのように改善すれば良いでしょうか。よろしくお願いいたします。


CC BY-SA 4.0
2021-07-20T14:44:01.147
78327
2021-07-20T16:34:51.937
2021-07-20T16:34:51.937
3060
47136
question
python python3
整数の和が0の場合の2乗の和


`res` はリストなので list comprehension(リスト内包表記)を使います。

[code]

    squares = sum(x*x for x in res)
    
[/code]

その他に numpy の dot
product(ドット積:[numpy.dot](https://numpy.org/doc/stable/reference/generated/numpy.dot.html#numpy.dot))
を使うと同じ結果が得られます。

[code]

    import numpy as np
    
    squares = np.dot(res, res)
    
[/code]


CC BY-SA 4.0
2021-07-20T15:14:32.003
78329
2021-07-20T15:14:32.003
47127
78327
answer


やろうとされていることはだいたい理解できましたが、いくつか別々の問題があるので、順に直していきましょう。

[code]

    res = []
    while True:
        num = int(input())
        if sum(res) != 0:
            res.append(num)
        else:
            break
    
[/code]

まず上記の部分ですが、 while ループの初回実行時では `res` 変数のリスト（配列）は空っぽです。  
このため、 `sum(res)` は 必ず 0 になります。  
ゆえに、 `input()` で入力された数値にかかわらず、 `break` に到達してしまいます。

ここでは、以下のように `sum` 関数で総和を計算する **前** に、 `res` リストに入力した数値を追加するのが良いでしょう。

[code]

    res = []
    while True:
        num = int(input())
        res.append(num)
        if sum(res) == 0:
            break
    
[/code]

これで、 意図したとおり 1, 2, -3 と入力されたときにループを抜けるようになりました。

* * *

しかし、これでもまだ以下のエラーは続きます。

[code]

    TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
    
[/code]

これは、 `res` 変数が、数値ではなく、リスト（配列）なので、一般的な算術計算ができないためです。

> 1、2、-3のそれぞれの2乗の和を足した

と書かれているので、ちゃんと `res` リスト内の **それぞれ** の要素について、2乗してやる必要があります。

書き方は色々ありますが、

[code]

    squares = 0
    for n in res:
        squares += n ** 2
    print(squares)
    
[/code]

とか、
[ジェネレータ式](https://docs.python.org/ja/3.7/reference/expressions.html#generator-
expressions) という仕組みを使って、以下のように1行で書くことも可能です。

[code]

    squares = sum(n ** 2 for n in res)
    print(squares)
    
[/code]

これで、期待した 14 が出力されます。


CC BY-SA 4.0
2021-07-20T15:15:48.197
78330
2021-07-20T15:32:35.280
2021-07-20T15:32:35.280
8237
8237
78327
answer