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

PythonでSeriesからアームストロング数を抽出・フィルタリングする方法

pandasのSeries(系列)データの中からアームストロング数だけを抽出してフィルタリングする方法を解説します。今回扱う元のSeriesと、フィルタリング後の出力結果は以下の通りです。

元のSeries:
0    153
1    323
2    371
3    420
4    500
dtype: int64

アームストロング数:
0    153
2    371
dtype: int64

アームストロング数とは?

アームストロング数とは、各桁の数字を3乗した値の合計が、元の数値そのものと一致する数のことです。たとえば 153 の場合、1³ + 5³ + 3³ = 1 + 125 + 27 = 153 となるため、アームストロング数に該当します。一方、323 や 420 はこの条件を満たさないため、フィルタリングの対象外となります。

解決のための手順

この問題を解くには、以下の手順に従います。

  • Seriesを定義する。

  • 空のリストを作成し、forループでSeries内のすべての要素に順番にアクセスできるようにする。

  • armstrong変数の初期値を0に設定し、Seriesの各要素を一時的に保持するtemp変数を作成する。

  • whileループで各桁の3乗の和を計算し、元の値と比較する。

  • 一致した値をリストに追加し、最後にisin()メソッドでSeriesから該当する要素だけを取り出す。

手順1:空のリストの作成とforループの準備

まず空のリストlを作成し、forループでSeriesの各要素valを順に取り出します。ループ内では、armstrongの初期値を毎回0にリセットし、現在の要素をtemp変数にコピーしておきます。

l = []
for val in data:
    armstrong = 0
    temp = val

手順2:whileループで各桁の3乗の和を計算

whileループを使い、tempが0より大きい間、以下の処理を繰り返します。

  • temp % 10 で最下位の桁(余り)を求める。

  • その桁の3乗をarmstrongに加算する。

  • temp // 10 でtempを10で割って次の桁へ移る。tempが0になった時点でループが終了します。

while(temp>0):
    rem = temp % 10
    armstrong = armstrong + (rem**3)
    temp = temp // 10

手順3:元の値との比較とリストへの追加

if文で、計算結果armstrongと元の値valを比較します。両者が一致すればその値はアームストロング数なので、append()メソッドでリストlに追加します。

if(armstrong==val):
    l.append(val)

手順4:isin()メソッドでSeriesをフィルタリング

最後に、isin()メソッドを使ってSeriesの各要素がリストlに含まれているかどうかを判定し、該当する要素だけを抽出します。

data[data.isin(l)]

完全なコード例

ここまでの手順をすべてまとめたコード全体は以下の通りです。

import pandas as pd
data = pd.Series([153, 323, 371, 420, 500])
print('元のSeries:')
print(data)
l = []
for val in data:
    armstrong = 0
    temp = val
    while(temp>0):
        rem = temp % 10
        armstrong = armstrong + (rem**3)
        temp = temp // 10
    if(armstrong==val):
        l.append(val)
print('アームストロング数:')
print(data[data.isin(l)])

実行結果

元のSeries:
0    153
1    323
2    371
3    420
4    500
dtype: int64
アームストロング数:
0    153
2    371
dtype: int64

このように、153と371だけがアームストロング数として正しく抽出されました。なお、上記のコードは3桁の数を前提として各桁を3乗しています。任意の桁数に対応させたい場合は、rem**3 の部分を rem**len(str(val)) に置き換えることで一般化できます。

  1. Pythonで数Nの桁数を数えるプログラムの書き方

    ある数Nが与えられたとき、その数に含まれる桁の総数を求めることを考えましょう。例えば以下のようなケースです。入力例1:N = 891452出力:6解説: 与えられた数891452は6桁の数字で構成されているため、この場合は「6」を返します。入力例2:N = 0074515出力:5解説: 先頭の0を除いた有効な桁数が5桁であるため、出力は「5」となります。この問題を解くためのアプローチこの問題は、次の手順で解決できます。数値nを入力として受け取ります。関数countDigits(n)が入力nを受け取り、桁数をカウントして返します。数値の各桁に対してループ処理を行い、カウンター変数を1ずつ増加させ

  2. Pythonで指定した範囲内の素数を出力するプログラムの書き方

    本記事では、指定された区間内のすべての素数を出力するPythonプログラムについて、その解法とアプローチをわかりやすく解説します。 問題文 開始値と終了値からなる区間が与えられます。この区間に含まれるすべての素数を出力することが課題です。 なお、素数とは、1より大きい自然数のうち、1とその数自身以外に正の約数を持たない数のことを指します。 解法のアプローチ この問題は、2つのforループを組み合わせて解決できます。 1つ目のループ: 区間内の各数値を順番に取り出します。 2つ目のループ: 取り出した数値が素数かどうかを判定します。 具体的には、ある数値が2からその数値自身の手前までのい