Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでリスト内の一意な要素だけの合計を求めるプログラム

重複する要素と一意な(一度しか現れない)要素が混在する配列 nums が与えられたとき、その中に存在する一意な要素のみの合計を求める問題を考えてみましょう。

例えば、入力が nums = [5,2,1,5,3,1,3,8] の場合、出力は 10 になります。これは、一度しか現れない要素が 28 のみであり、その合計が 10 だからです。

解決のアプローチ

この問題は、以下の手順で解くことができます。

  • 各要素の出現回数を記録した辞書(カウンター)を作成する
  • 合計を格納する変数 ans を 0 で初期化する
  • 配列 nums の各値 v について、出現回数がちょうど 1 回であれば ans に加算する
  • 最後に ans を返す

Pythonでの実装例

以下は、Pythonの標準ライブラリ collections.Counter を使った実装例です。Counterを使うことで、各要素の出現回数を簡単に集計できます。

from collections import Counter

def solve(nums):
    count = Counter(nums)
    ans = 0
    for index, value in enumerate(nums):
        if count[value] == 1:
            ans += value
    return ans

nums = [5,2,1,5,3,1,3,8]
print(solve(nums))

入力

[5,2,1,5,3,1,3,8]

出力

10

処理の流れを解説

  1. Counterで頻度を集計: Counter(nums) により、{5: 2, 2: 1, 1: 2, 3: 2, 8: 1} という出現回数の辞書が生成されます。
  2. 一意な要素を判定: 各要素の出現回数が 1 であるかを確認し、該当するものだけを合計に加えます。この例では 28 が該当します。
  3. 結果を返す: 2 + 8 = 10 が出力されます。

別の書き方:内包表記を使った簡潔な実装

より簡潔に書きたい場合は、以下のように1行で表現することも可能です。

from collections import Counter

def solve(nums):
    c = Counter(nums)
    return sum(v for v in nums if c[v] == 1)

計算量

このアルゴリズムの時間計算量は O(n)、空間計算量も O(n) です(n は配列の長さ)。配列を2回走査するだけで済むため、大規模なデータに対しても効率的に動作します。

  1. Pythonで二分木の全ノードの値の合計を求めるプログラム

    二分木(バイナリツリー)にいくつかの値が格納されている場合、木に含まれるすべての値の合計を求めたいことがあります。例えば、次のような二分木が入力として与えられたとします。この場合、出力は 14 になります(2 + 4 + 3 + 5 = 14)。解決のアプローチこの問題を解くには、再帰を使って各ノードを順番に訪問し、値を足し合わせていきます。具体的な手順は以下の通りです。関数 recurse() を定義します。引数としてノードを受け取ります。変数 val に現在のノードの値を代入します。ノードの左の子が存在する場合は、val に左部分木の再帰結果を加算します。ノードの右の子が存在する場合は、v

  2. リスト内の要素の合計を求めるPythonプログラム

    この記事では、Pythonを使ってリスト内のすべての要素の合計を求める方法について、具体的なコード例とともに解説します。問題の定義リストが入力として与えられたとき、そのリストに含まれるすべての要素の合計値を計算する必要があります。例えば、[1, 2, 3, 4, 5]というリストが与えられた場合、出力は 15(1+2+3+4+5)となります。この問題を解くためのアプローチは主に2つあります。1つは組み込み関数を使用する方法、もう1つはブルートフォース(総当たり)方式でループ処理を行う方法です。方法1:組み込み関数 sum() を使うPythonには標準で用意されている組み込み関数 sum()