85261


下記のようなlistがあります。

[code]

    list = [16, 1, 9, 26, 1]
    
[/code]

これを、隣り合う二つの要素を加算していくロジックを組みたいのですが、上手く組めずにいます。  
最終的にlist内が1つになったら終了します。  
分かる方がいらっしゃいましたらご教示よろしくお願いいたします。

目的の出力

[code]

    [16, 1, 9, 26, 1]→[17, 10, 35, 27]→[27, 45, 62]→[72, 107]→[179]
    # 最終出力結果
    179
    
[/code]

こんな感じの出力結果を出したいです。  
よろしくお願いいたします。


CC BY-SA 4.0
2021-11-21T06:25:55.247
83736
2021-12-21T20:56:04.517
2021-11-21T06:32:03.987
3060
47752
question
python python3
隣り合う二つの要素計算


> 最終的にlist内が1つになったら終了します。
>
> [16, 1, 9, 26, 1]→[17, 10, 35, 27]→[27, 45, 62]→[72, 107]→[179]  
>  # 最終出力結果  
>  179

上記の通りに処理を行う場合は以下。

[code]

    from functools import reduce
    
    lst = [16, 1, 9, 26, 1]
    result = reduce(lambda s, _: list(map(sum, zip(s, s[1:]))) or s[0], lst, lst)
    print(result)
    
    #
    179
    
[/code]

**補遺**

憶測になりますが、これは二項係数を使って解く事が期待されている課題なのではないかと思います。

[code]

    [a1, a2, a3, a4, a5]
    =>
    [(a1+a2), (a2+a3), (a3+a4), (a4+a5)]
    =>
    [(a1+2*a2+a3), (a2+2*a3+a4), (a3+2*a4+a5)]
    =>
    [(a1+3*a2+3*a3+a4), (a2+3*a3+3*+a5)]
    =>
    [a1 + 4*a2 + 6*a3 + 4*a4 + a5]
    
[/code]

[code]

    from math import factorial as fc, comb
    
    lst = [16, 1, 9, 26, 1]
    n = len(lst) - 1
    binomial_coefficients = [comb(n, n-r) for r in range(n+1)]
    print(sum(x*y for x, y in zip(binomial_coefficients, lst)))
    
    #
    179
    
[/code]


CC BY-SA 4.0
2021-11-21T07:44:29.430
83737
2021-11-21T08:54:23.703
2021-11-21T08:54:23.703
47127
47127
83736
answer


素直に書いてあるロジックどおりの実装をしました。

[code]

    L = [16, 1, 9, 26, 1]
    while len(L) > 1:
        L = [num + L[i+1] for i, num in enumerate(L[:-1])] #末尾の1つ前の要素まで
        print(L)
    print(L[0])
    
[/code]

出力結果

[code]

    [17, 10, 35, 27]
    [27, 45, 62]
    [72, 107]
    [179]
    179
    
[/code]

内包表記をつかわないとしたらこんな感じです。

[code]

    L = [16, 1, 9, 26, 1]
    
    while len(L) > 1:
        tempL = []
        for i, num in enumerate(L[:-1]):
            tempL.append(num + L[i+1])
        L = tempL
        print(L)
    
    print(L[0])
    
[/code]


CC BY-SA 4.0
2021-11-21T12:22:04.260
83743
2021-11-23T13:28:59.450
2021-11-23T13:28:59.450
28626
28626
83736
answer


別解です。

[code]

    >>> tmp = [16, 1, 9, 26, 1]
    >>> while len(tmp) > 1:
    ...     tmp = [i+j for i,j in zip(tmp, tmp[1:])]
    ...
    >>> tmp.pop()
    179
    
[/code]

* * *

Pythonでリスト1個ずらしのループは以下の方法がよく使われます。

[code]

    >>> L = [16, 1, 9, 26, 1]
    >>> for i,j in zip(L, L[1:]):
    ...     print(i+j)
    ...
    17
    10
    35
    27
    
[/code]

これを内包表記にします

[code]

    >>> tmp = [i+j for i,j in zip(L, L[1:])]
    >>> tmp
    [17, 10, 35, 27]
    
[/code]

これを繰り返し実行します

[code]

    >>> tmp = [i+j for i,j in zip(tmp, tmp[1:])]
    >>> tmp
    [27, 45, 62]
    >>> tmp = [i+j for i,j in zip(tmp, tmp[1:])]
    >>> tmp
    [72, 107]
    >>> tmp = [i+j for i,j in zip(tmp, tmp[1:])]
    >>> tmp
    [179]
    
[/code]

繰り返しは最後1個になるまで行うので、whileで書きます

[code]

    >>> tmp = L
    >>> tmp
    [16, 1, 9, 26, 1]
    >>> while len(tmp) > 1:
    ...     tmp = [i+j for i,j in zip(tmp, tmp[1:])]
    ...
    >>> tmp
    [179]
    
[/code]


CC BY-SA 4.0
2021-12-21T20:56:04.517
85261
2021-12-21T20:56:04.517
806
83736
answer