Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 주어진 시리즈에서 암스트롱 수 필터링하기

암스트롱 수(Armstrong Number)는 각 자릿수를 세제곱하여 모두 더한 값이 원래 수와 같아지는 수를 말합니다. 예를 들어, 153은 1³ + 5³ + 3³ = 1 + 125 + 27 = 153이므로 암스트롱 수입니다. 이 글에서는 판다스(Pandas) 시리즈에 담긴 숫자 중에서 암스트롱 수만 골라내는 방법을 단계별로 살펴보겠습니다.

다음과 같은 시리즈가 있고, 여기서 암스트롱 수를 필터링한 결과를 얻는다고 가정해 보겠습니다.

original series is
0    153
1    323
2    371
3    420
4    500
dtype: int64

Armstrong numbers are:-
0    153
2    371
dtype: int64

문제 해결 절차

이 문제는 아래 단계를 따라 해결할 수 있습니다.

1단계: 시리즈 정의 및 빈 리스트 생성

먼저 시리즈를 정의합니다. 그다음 빈 리스트를 만들고, for 루프를 사용해 시리즈의 모든 데이터에 하나씩 접근합니다.

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

armstrong 변수는 자릿수 세제곱의 합을 누적하기 위해 0으로 초기화하고, temp 변수에는 시리즈의 각 요소를 임시로 저장합니다.

2단계: while 루프로 자릿수 세제곱의 합 계산

while 루프를 사용해 temp가 0보다 큰 동안 다음 작업을 반복합니다. temp % 10으로 마지막 자릿수(나머지)를 구하고, 그 세제곱을 armstrong에 더합니다. 이후 temp를 10으로 나누어 몫만 남기고, temp가 0이 되면 루프가 자동으로 종료됩니다.

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

3단계: 원래 값과 비교하여 리스트에 추가

if 조건문으로 계산된 armstrong 값과 원래 값(val)을 비교합니다. 두 값이 일치하면 해당 수가 암스트롱 수이므로 리스트에 추가합니다.

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

4단계: isin()으로 시리즈 필터링

마지막으로 isin() 메서드를 사용해 리스트에 담긴 값들이 시리즈에 존재하는지 확인하고, 해당 값만 필터링합니다.

data[data.isin(l)]

전체 코드 예제

지금까지 설명한 과정을 하나의 코드로 구현하면 다음과 같습니다.

import pandas as pd
data = pd.Series([153,323,371,420,500])
print("original series is\n", 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("Armstrong numbers are:-")
print(data[data.isin(l)])

실행 결과

original series is
0    153
1    323
2    371
3    420
4    500
dtype: int64

Armstrong numbers are:-
0    153
2    371
dtype: int64

실행 결과를 보면 153과 371만 암스트롱 수로 필터링된 것을 확인할 수 있습니다. 153은 1³ + 5³ + 3³ = 153, 371은 3³ + 7³ + 1³ = 371이기 때문입니다. 반면 323, 420, 500은 각 자릿수 세제곱의 합이 자기 자신과 같지 않으므로 결과에서 제외되었습니다.