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

Pythonでタプルのリストから上位K個の要素を抽出する方法

タプルを含むリストが与えられたとき、その中から上位K個の要素を抽出する必要があるケースはよくあります。例えばKが3であれば、リスト内のタプルから値の大きい順に上位3つの要素を取り出します。

本記事では、defaultdictを使う方法と、sorted関数とitemgetterを組み合わせる方法の2つのアプローチを紹介します。

方法1:defaultdictを使う

まず、collections.defaultdictを使って要素を辞書型のコンテナに格納します。その後、上位K個の条件を満たす要素だけを取り出します。具体的には、各キー(曜日など)に対応する値をリストにまとめ、合計値を計算してから降順にソートし、先頭からK個を取得します。

サンプルコード

import collections
from operator import itemgetter
from itertools import chain
# 入力リストの初期化
listA = [[('Mon', 126)], [('Tue', 768)],[('Wed', 512)], [('Thu', 13)],[('Fri', 341)]]
# Kを設定
K = 3
# 入力リストの表示
print("Given list:\n",listA)
print("Check value:\n",K)
# defaultdictを使用
dict_ = collections.defaultdict(list)
new_list = list(chain.from_iterable(listA))
for elem in new_list:
    dict_[elem[0]].append(elem[1])
res = {k: sum(v) for k, v in dict_.items()}
# sortedで並べ替え
res = sorted(res.items(), key=itemgetter(1),
reverse=True)[0:K]
# 結果の出力
print("Top 3 elements are:\n", res)

実行結果

Given list:
[[('Mon', 126)], [('Tue', 768)], [('Wed', 512)], [('Thu', 13)], [('Fri', 341)]]
Check value:
3
Top 3 elements are:
[('Tue', 768), ('Wed', 512), ('Fri', 341)]

このコードでは、chain.from_iterableでネストされたリストを平坦化し、defaultdictにキーごとに値を蓄積しています。同じキーが複数回出現する場合でも、値の合計が正しく計算される点が特徴です。

方法2:sortedとitemgetterを使う

2つ目のアプローチでは、itemgetter関数をsorted関数の中で使用し、スライス(0からKまで)を指定して上位K個だけを取得します。こちらの方がコードがシンプルで、タプルの2番目の要素(数値)を基準に直接並べ替えられるのが利点です。

サンプルコード

from operator import itemgetter
from itertools import chain
# 入力リストの初期化
listA = [[('Mon', 126)], [('Tue', 768)],[('Wed', 512)], [('Thu', 13)],[('Fri', 341)]]
# Kを設定
K = 3
# 入力リストの表示
print("Given list:\n",listA)
print("Check value:\n",K)
# sortedを使用
res = sorted(list(chain.from_iterable(listA)),
    key = itemgetter(1), reverse = True)[0:K]
# 結果の出力
print("Top 3 elements are:\n", res)

実行結果

Given list:
[[('Mon', 126)], [('Tue', 768)], [('Wed', 512)], [('Thu', 13)], [('Fri', 341)]]
Check value:
3
Top 3 elements are:
[('Tue', 768), ('Wed', 512), ('Fri', 341)]

まとめ

どちらの方法も同じ結果が得られますが、用途によって使い分けるとよいでしょう。同一キーの値を集約したい場合はdefaultdict方式、単純に数値の大きい順に上位K件を取得したい場合はsorted+itemgetter方式が適しています。特に後者はコードが簡潔で可読性が高いため、日常的なデータ処理でおすすめの手法です。

  1. 【初心者向け】Pythonでリストのサイズ(要素数)を取得する方法

    リスト(list)は、Pythonにおける代表的なコレクション型のデータ構造の一つです。リストの要素は後から変更でき、重複した値を持つこともできます。本記事では、Pythonでリストのサイズ(長さ)を取得する方法を解説します。具体的には、重複の有無にかかわらず、リストに含まれる全要素の数をカウントする方法を紹介します。リストの長さを取得する基本:len()関数Pythonでリストの要素数を取得するには、組み込み関数の len() を使用します。len() はリストだけでなく、タプル・文字列・辞書などさまざまなコレクションに対しても利用できる汎用的な関数です。サンプルコード以下の例では、「day

  2. PythonでリストからN個の最大要素を取得する方法

    整数のリストが与えられたとき、その中からN個の大きな要素を取り出して新しいリストとして返すのが、ここでの課題です。本記事では、基本的なループ処理による方法から、Python標準ライブラリを活用した効率的な方法まで、サンプルコードとともに解説します。 例 入力 : [40, 5, 10, 20, 9] N = 2 出力 : [40, 20] アルゴリズム 整数のリストと、取得する要素数Nを受け取ります。 N回のループを実行します。 各ループでリスト内の最大値を探し、新しいリストに格納すると同時に元のリストから削除します。 実装コード def Nnumberele(list1, N):